1. which命令介绍

Linux基础命令-which_版本信息

which 命令用于查找并显示给定命令的绝对路径,环境变量 PATH 中保存了查找命令时需要遍历的目录。

which 指令会在环境变量 $PATH 设置的目录里查找符合条件的文件。也就是说,使用 which 命令,就可以看到某个系统命令是否存在,以及执行的到底是哪一个位置的命令。

2. 语法格式及常用选项

我们可以用which which来查看which命令在哪个位置:

[root@doc ~]# which which

Linux基础命令-which_系统管理_02

which查看帮助,我们可以使用 --help查看:

[root@doc ~]# which --help

Linux基础命令-which_文件名_03

把常用的参数整理成图表如下:

参数

描述

-a

查找全部内容,而非第一个文件

-n

<文件名长度>  指定文件名长度,指定的长度必须大于或等于所有文件中最长的文件名。

-p

<文件名长度>  与-n参数相同,但此处的<文件名长度>包括了文件的路径。

-w

指定输出时栏位的宽度。

-V

显示版本信息。

–version, -[vV]

显示版本信息并退出

–help

–skip-dot

跳过 PATH 中以点开头的目录

–skip-tilde

跳过 PATH 中以波形符号开头的目录

–show-dot

不要在输出中将点扩展到当前目录

–show-tilde

为 HOME 目录(非根目录)输出波形

–tty-only

如果不在 tty 上,停止右边的处理选项

–all, -a

打印 PATH 中的所有匹配项,而不仅仅是第一个

–read-alias, -i

从 stdin 中读取别名列表

–skip-alias

忽略选项 --read-alias;不读 stdin

–read-functions

从 stdin 读取 shell 函数

–skip-functions

忽略选项 --read-functions;不读 stdin

也可以使用man which 查看相关的内容

3. 参考案例

3.1 显示命令的路径

此时,无需加任何参数,比如我们要显示 find的路径

[root@mufengxiaoyue ~]# which find
/usr/bin/find

可以看到find的路径在/usr/bin/find、我们使用ls查看是否正确

[root@mufengxiaoyue ~]# ls /usr/bin/find
/usr/bin/find

如果我们把find命令移走会怎么样?

发现移走后就找不到了:

root@mufengxiaoyue ~]# which find
/usr/bin/which: no find in (/usr/lib64/qt-3.3/bin:/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin:/root/bin)

如果改名会怎么样?

当然了,改名字也是不行的,不信你看:

[root@mufengxiaoyue ~]# mv /usr/bin/find /usr/bin/find.bak
[root@mufengxiaoyue ~]# which find
/usr/bin/which: no find in (/usr/lib64/qt-3.3/bin:/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin:/root/bin)

说明:which 是根据使用者所配置的 PATH 变量内的目录去搜寻可运行文件!所以,不同的 PATH 配置内容所找到的命令可能不一样的
w

3.2 显示命令的别名

如果变量有别名,会直接显示变量的别名

[root@mufengxiaoyue ~]# which rm
alias rm='rm -i'
  /usr/bin/rm

rm的别名是rm -i

3.3 普通用户和root用户查找路径不同

## root用户的时候
[root@mufengxiaoyue ~]# which cd
/usr/bin/cd
## 普通用户的时候
[root@mufengxiaoyue ~]# useradd mufeng
[root@mufengxiaoyue ~]# su - mufeng
[mufeng@mufengxiaoyue ~]$  which cd
/bin/cd
[mufeng@mufengxiaoyue ~]$

4. /bin,/sbin,/usr/sbin,/usr/bin 目录区别

我们经常看到这几个目录,他们都是用来存放命令的。

/sbin 和/bin

1. 从命令功能区分

  • /sbin 下的命令属于基本的系统命令,如shutdown,reboot,用于启动系统,修复系统
  • /bin下存放一些普通的基本命令,如ls,chmod等,这些命令在Linux系统里的配置文件脚本里经常用到

2. 从用户权限角度区分

  • /sbin目录下的命令通常只有管理员才可以运行
  • /bin下的命令管理员和一般的用户都可以使用。

转一个网友的解读,个人觉得解释的很到位

/bin是系统的一些指令,主要放置一些系统的必备执行命令
比如:

cat、cp、chmod df、dmesg、gzip、kill、ls、mkdir、more、mount、rm、su、tar等

/sbin一般是指超级用户指令。 主要放置一些系统管理的必备程式
比如

dump、fdisk、halt、ifconfig、ifup、 ifdown、init、insmod ,lsmod、reboot、shutdown 等。

/usr/bin 是你在后期安装的一些软件的运行脚本。主要放置一些应用软体工具的必备执行档
比如:

c++、g++、gcc、make wget 等

/usr/sbin 放置一些用户安装的系统管理的必备程式
例如

dhcpd、httpd、imap、、inetd、named、netconfig、samba、sendmail、squid、swap、tcpdump 等

这些东西记起来比较麻烦,最好的办法就是用which查看,看看属于哪个目录。