在Linux中,不同的目录下可能有相同的文件。虽然同名,两个文件的作用却完全不同。

无标题

执行同一命令,可能会显示完全不同的结果。如pwd本来显示当前工作目录,我们却可以定义别名使它输出时间。

无标题1

要了解命令执行的先后顺序,首先我们要明白内部命令和外部命令的不同。使用type command可以查看命令类型。

无标题2

我们可以看到以上四个命令的显示结果是完全不同的。

这里pwd是内部命令,cal是hash(缓存)命令,ls是别名,date则是外部命令。

这里要引进一个变量PATH,通过echo,我们可以查看变量PATH的值。

无标题3

CentOS 6.9与CentOS 7.3里PATH的值有所不同。

无标题4

不过两者中的PATH表示的都是是shell搜索命令执行的顺序。

在CentOS 7.3中我们可以用whereis 查看pwd的路径。

无标题5

可以看到此时的pwd路径为/usr/bin/pwd,后面的两个则是pwd命令的帮助文档。

这时我们执行enable -n pwd命令,禁用pwd原本的内部命令的功能。

这时type下,会发现pwd成了外部命令。

我们把/usr/sbin/ifconfig复制到/usr/loacl/sbin下并取名为pwd。

执行pwd,会输出ifconfig显示ip地址的功能。

无标题9

可以看出,外部命令的执行顺序是按PATH变量的值搜索的。

CentOS 7.3中PATH= /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin。冒号为分隔符。

上述中,/usr/local/sbin/下的pwd优先于/usr/bin下的pwd,执行/usr/local/sbin/pwd的结果。

这时我们可以使用rm -rf删除/usr/local/sbin/pwd。这时只有/usr/bin/pwd存在。

执行pwd,我们发现并没有输出当前工作目录。反而显示/usr/local/sbin/pwd不存在。

type pwd,此时的pwd是hash命令。

hash -d pwd,删除pwd的缓存。再执行pwd,pwd终于显示了当前的工作目录。

无标题10

上述证明,hash的命令执行要优先于PATH。

这时我们type pwd。

再次清除pwd的hash条目。再次复制ifconfig到/usr/local/sbin/pwd,使pwd输出ifconfig的效果。

无标题11

type以下,pwd再次成为hash命令。

enable pwd,使pwd恢复为内部命令。

执行pwd,输出为当前工作目录。

可知,内部命令执行优先于hash。

无标题12

alias pwd=cal,为pwd设置别名为cal。

执行pwd,我们会发现pwd输出了当月日历。

可知,alias(别名)的执行优先于builtin(内部命令)。

综上,命令执行的优先级即为:alias > 内部命令> hash > PATH 。当然,如果PATH中也找不到的话,就只能command not found了。

无标题13