linux命令-whereis与which命令详解

linux命令-whereis与which命令详解

一、whereis 命令详解

1. 基本语法与功能

whereis [选项] 文件名...
  • 功能:快速定位与程序相关的文件,包括二进制文件、手册页(man pages)和源代码。
  • 特点
    • 依赖系统预生成的数据库,搜索速度极快。
    • 默认搜索范围包括标准系统路径(如 /usr/bin/usr/share/man)。
    • 不支持自定义路径扩展,但可通过选项限制搜索类型。

2. 常用选项

选项说明
-b仅搜索二进制文件(可执行文件)
-m仅搜索手册页
-s仅搜索源代码文件
-u搜索“不完整”文件(如仅有二进制但无手册页的程序)
-B指定二进制文件的搜索路径(需与 -f 结合使用)
-M指定手册页的搜索路径(需与 -f 结合使用)
-S指定源代码的搜索路径(需与 -f 结合使用)
-f终止路径列表并开始解析文件名

3. 常用示例及说明

示例 1:查找 ls 的所有相关文件
whereis ls

输出

ls: /usr/bin/ls /usr/share/man/man1/ls.1.gz

功能:显示 ls 的二进制文件路径和手册页位置。


示例 2:仅查找二进制文件
whereis -b python3

输出

python3: /usr/bin/python3

功能:定位 python3 的可执行文件路径。


示例 3:仅查找手册页
whereis -m gcc

输出

gcc: /usr/share/man/man1/gcc.1.gz

功能:查找 gcc 的手册页位置。


示例 4:仅查找源代码文件
whereis -s bash

输出

bash: /usr/src/bash

说明:若系统中安装了 bash 的源代码,则显示路径(需安装 bash-source 等源码包)。


示例 5:查找“不完整”程序
whereis -u nmap

输出

nmap: /usr/bin/nmap

功能:若 nmap 仅有二进制文件而无手册页/源码,则显示结果。


示例 6:自定义二进制文件搜索路径
whereis -B /usr/local/bin -f nginx

输出

nginx: /usr/local/bin/nginx

功能:在指定路径 /usr/local/bin 中搜索 nginx 的二进制文件。


示例 7:组合选项查找二进制和手册页
whereis -bm ls

输出

ls: /usr/bin/ls /usr/share/man/man1/ls.1.gz

功能:同时显示二进制文件和手册页路径。


示例 8:批量查找多个程序
whereis python3 node

输出

python3: /usr/bin/python3 /usr/lib/python3 /usr/share/python3
node: /usr/bin/node /usr/share/man/man1/node.1.gz

功能:批量查询 python3node 的文件路径。


示例 9:处理未安装的程序
whereis docker-compose

输出

docker-compose:

说明:若程序未安装,则无输出。


示例 10:查找内核相关文件
whereis -b vmlinuz

输出

vmlinuz: /boot/vmlinuz-5.4.0-80-generic

功能:定位内核镜像文件路径。


示例 11:排除手册页查找
whereis -b -m0 ls

输出

ls: /usr/bin/ls

功能:仅显示二进制文件路径,忽略手册页。


示例 12:查找 Shell 内置命令
whereis cd

输出

cd:

说明cd 是 Shell 内置命令,whereis 无法找到其路径。


4. 常见问题与技巧

  • 问题 1whereis 未找到源代码文件。
    解决:需安装 *-source*-src 软件包(如 apt install bash-source)。

  • 问题 2:自定义路径搜索失败。
    解决:确保使用 -B/-M/-S 时与 -f 结合(如 whereis -B /custom/bin -f myapp)。

  • 技巧:结合 grep 过滤结果:

    whereis -m gcc | grep man1
    

二、which 命令详解

1. 基本语法与功能

which [选项] 命令名...
  • 功能:在 PATH 环境变量中查找可执行文件的路径。
  • 特点
    • 实时搜索 PATH 中的目录,结果反映当前环境。
    • 支持处理别名(Alias)和 Shell 函数。
    • 无法查找手册页或源代码。

2. 常用选项

选项说明
-a显示所有匹配路径(而非仅第一个)
-i忽略大小写(部分 Shell 不支持)
--skip-alias跳过别名(直接查找原始命令)
--skip-functions跳过 Shell 函数

3. 常用示例及说明

示例 1:查找 python3 的路径
which python3

输出

/usr/bin/python3

功能:显示 python3 的可执行文件路径。


示例 2:显示所有匹配路径
which -a java

输出

/usr/bin/java
/opt/jdk-11.0.1/bin/java

功能:列出 PATH 中所有 java 的安装路径。


示例 3:处理别名
alias ls='ls --color=auto'
which ls

输出

/usr/bin/ls

说明:默认显示原始路径,而非别名定义。


示例 4:忽略别名
which --skip-alias ls

输出

/usr/bin/ls

功能:绕过 Shell 别名,显示真实路径。


示例 5:批量查找多个命令
which gcc make

输出

/usr/bin/gcc
/usr/bin/make

功能:批量查询 gccmake 的路径。


示例 6:查找不存在的命令
which mycustomtool

输出:无
说明:若命令未安装或不在 PATH 中,则无输出。


示例 7:结合 echo 调试 PATH
echo $PATH
which -a python

功能:先查看 PATH 变量,再定位 python 的路径。


示例 8:处理 Shell 内置命令
which cd

输出:无
说明cd 是 Shell 内置命令,which 无法找到其路径。


示例 9:查找符号链接目标
which node

输出

/usr/bin/node

说明:若 node 是符号链接,则显示链接目标路径。


示例 10:查找脚本路径
which myscript.sh

输出

/home/user/bin/myscript.sh

条件myscript.sh 必须有可执行权限且在 PATH 中。


示例 11:忽略大小写查找
which -i GCC

输出

/usr/bin/gcc

功能:忽略大小写匹配 GCCgcc


示例 12:跳过 Shell 函数
myfunc() { echo "This is a function"; }
which --skip-functions myfunc

输出:无
功能:跳过对函数 myfunc 的查找。


4. 常见问题与技巧

  • 问题 1which 找不到脚本路径。
    解决:确保脚本有可执行权限,且所在目录在 PATH 中。

  • 问题 2:忽略别名无效。
    解决:使用 \which/usr/bin/which 绕过 Shell 别名。

  • 技巧:结合 type 命令(更全面):

    type -a ls
    

三、whereis vs which 核心区别

1. 设计目的对比

特性whereiswhich
主要目标查找程序的多类文件(二进制、手册等)定位 PATH 中的可执行文件路径
数据来源预定义的系统数据库(可能非实时)实时搜索 PATH 环境变量
输出内容二进制、手册、源码路径仅可执行文件路径
处理别名不支持可跳过别名(需选项支持)
跨平台兼容性主要类 Unix 系统多数 Shell 支持(如 Bash、Zsh)

2. 适用场景分析

  • 使用 whereis

    • 需要快速获取程序的完整文件分布(如开发调试)。
    • 确定手册页或源码位置(如学习命令用法)。
  • 使用 which

    • 确认命令的实际执行路径(如解决多版本冲突)。
    • 验证脚本或工具是否在 PATH 中可用。

3. 性能与限制

  • whereis

    • 优势:速度极快(依赖预生成的数据库)。
    • 限制:数据库更新滞后(需定期运行 updatedb)。
  • which

    • 优势:实时性高(直接搜索 PATH)。
    • 限制:无法查找非可执行文件或 Shell 内置命令。

4. 典型场景示例

  • 开发调试

    • whereis -s openssl:查找 OpenSSL 的源码路径。
    • which openssl:确认当前使用的 OpenSSL 版本。
  • 系统管理

    • whereis -u docker:检查 Docker 是否缺少手册页。
    • which -a python:查看所有已安装的 Python 版本路径。

四、高级应用与脚本集成

1. 结合其他命令

查找手册页并打开
man $(whereis -m python3 | awk '{print $2}')
检查命令是否存在
if which git >/dev/null; then
    echo "Git 已安装"
else
    echo "Git 未安装"
fi

2. 自动化脚本中的使用

批量验证工具安装
TOOLS=(docker kubectl helm)
for tool in "${TOOLS[@]}"; do
    if ! which $tool >/dev/null; then
        echo "错误:$tool 未安装!"
        exit 1
    fi
done
echo "所有依赖工具已就绪。"

五、总结

核心差异

  • whereis:以程序为中心,提供二进制、手册和源码的完整路径信息,适合开发者或系统管理员。
  • which:以用户为中心,快速定位当前环境下实际执行的命令路径,适合终端用户或脚本调试。

选择建议

  • 需查找手册页或源码时,使用 whereis
  • 需确认命令执行路径或解决环境冲突时,使用 which
  • 两者互补,可根据场景结合使用。
### 分数阶微分在光谱影像处理中的应用及实现方法 #### 应用背景 分数阶微分作为一种数学工具,在图像处理领域具有独特的优势。其核心在于能够有效提取图像的边缘、纹理其他局部特征,这对于多光谱图像融合以及其他复杂的光谱影像处理任务尤为重要[^1]。 #### 图像预处理 对于多光谱图像而言,预处理阶段至关重要。这一过程通常包括去噪、对比度增强以及图像配准等操作。这些步骤旨在提高原始数据质量,从而为后续的分数阶微分运算提供可靠的基础输入。 #### 实现方法 ##### 基于Matlab的分数阶微分实现 在实际应用中,可以借助Matlab内置函数(如`dfilt`)完成分数阶微分运算。具体来说,该技术通过对预处理后的多光谱图像施加分数阶微分算子,进一步突出目标区域内的细节信息。这种处理方式有助于提升图像的空间分辨率视觉效果。 以下是基于Matlab的一个简单代码示例: ```matlab % 定义分数阶参数 alpha beta alpha = 0.5; % 阶次调整 beta = 0.8; % 加载并读取多光谱图像 I = imread('multispectral_image.jpg'); grayImage = rgb2gray(I); % 使用 dfilt 函数创建分数阶滤波器对象 d = fdesign.fracdelay(alpha); Hd = design(d, 'lagrange'); % 对灰度图执行分数阶微分 filteredImage = filter(Hd.Numerator, 1, double(grayImage)); % 显示结果 figure; subplot(1,2,1); imshow(grayImage, []); title('Original Image'); subplot(1,2,2); imshow(uint8(filteredImage), []); title('Fractional Differentiated Image'); ``` ##### 结合分数阶样条小波变换的应用 除了传统的分数阶微分外,还可以引入更先进的分数阶样条小波变换(FSSWT)。这种方法不仅继承了传统小波变换的优点,还融入了分数阶微分的能力,使其更适合用于复杂场景下的光谱影像分析。例如,在多光谱全色图像融合过程中,先分别对两种类型的图像实施分数阶样条小波分解,再依据特定规则(如像素级加权平均或基于小波系数的选择策略)进行重构,最终获得高质量的融合产物[^2]。 #### 后续处理优化 为了进一步改善融合图像的效果,还需要对其进行逆变换及相关后置修正工作,比如再次去除可能残留的噪声干扰或者适当调节整体亮度分布等。这一步骤同样不可或缺,因为只有这样才能真正达到预期的技术指标要求。 #### 工具库支持 值得注意的是,Python生态体系下也存在强大的科学计算库——SciPy,它可以作为替代方案之一参到上述流程当中。特别是其中的积分/微分模块(`scipy.integrate`),提供了丰富的接口供开发者调用,进而简化开发难度的同时提高了程序运行效率[^3]。 ```python from scipy import integrate import numpy as np def fractional_derivative(x, order=0.5): """ 计算一维信号 x 的分数阶导数 """ n = len(x) result = [] for k in range(n): term = sum([((-1)**j * integrate.quad(lambda t: (k-t)**(-order-1), j-1, j)[0]) for j in range(k+1)]) result.append(term) return np.array(result) # 测试用例 input_signal = np.linspace(0, 10, num=100) output_signal = fractional_derivative(input_signal, order=0.75) print(output_signal[:10]) ``` --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

鸭梨山大。

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值