在Linux中,不同的目录下可能有相同的文件。虽然同名,两个文件的作用却完全不同。
执行同一命令,可能会显示完全不同的结果。如pwd本来显示当前工作目录,我们却可以定义别名使它输出时间。
要了解命令执行的先后顺序,首先我们要明白内部命令和外部命令的不同。使用type command可以查看命令类型。
我们可以看到以上四个命令的显示结果是完全不同的。
这里pwd是内部命令,cal是hash(缓存)命令,ls是别名,date则是外部命令。
这里要引进一个变量PATH,通过echo,我们可以查看变量PATH的值。
CentOS 6.9与CentOS 7.3里PATH的值有所不同。
不过两者中的PATH表示的都是是shell搜索命令执行的顺序。
在CentOS 7.3中我们可以用whereis 查看pwd的路径。
可以看到此时的pwd路径为/usr/bin/pwd,后面的两个则是pwd命令的帮助文档。
这时我们执行enable -n pwd命令,禁用pwd原本的内部命令的功能。
这时type下,会发现pwd成了外部命令。
我们把/usr/sbin/ifconfig复制到/usr/loacl/sbin下并取名为pwd。
执行pwd,会输出ifconfig显示ip地址的功能。
可以看出,外部命令的执行顺序是按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终于显示了当前的工作目录。
上述证明,hash的命令执行要优先于PATH。
这时我们type pwd。
再次清除pwd的hash条目。再次复制ifconfig到/usr/local/sbin/pwd,使pwd输出ifconfig的效果。
type以下,pwd再次成为hash命令。
enable pwd,使pwd恢复为内部命令。
执行pwd,输出为当前工作目录。
可知,内部命令执行优先于hash。
alias pwd=cal,为pwd设置别名为cal。
执行pwd,我们会发现pwd输出了当月日历。
可知,alias(别名)的执行优先于builtin(内部命令)。
综上,命令执行的优先级即为:alias > 内部命令> hash > PATH 。当然,如果PATH中也找不到的话,就只能command not found了。