在现实中,一个Linux系统内,有可能存在两个名称相同的命令。
这可能是后辈重写了一个功能相同的命令,也可能是功能不同,但是名称巧合了。
在这种情况下,操作者要准确执行你想要的命令就需要特别注意技巧。
有人说,我用全路径来执行就好啦,或者用cd进入到那个命令所在的目录再执行。
这种说法在某些情况下确实有效,有时候无效。
比如:
一个命令跟系统中的内建命令或者是别名相同,那么该怎么办?
这里做一个实验。在/usr/local/bin/下创建一个脚本,名字为“ll”。
大家很熟悉这个名字吧,在CentOS系统中是ls命令带参数执行的别名。
脚本内容如下:
#!/bin/bash
echo "this is /usr/local/bin/ll."
给这个脚本赋予执行权限。
chmod +x /usr/local/bin/ll
然后执行命令:
cd /usr/local/bin/
ll
此时执行结果为ls命令执行后输出的目录下列表。
显然没执行脚本。
我们现在再执行如下命令:
command ll
此时结果是终端输出了“this is /usr/local/bin/ll.”
这里显然是command起到了作用。
command的作用是禁用别名和函数。
bash执行命令的优先级:
1.别名
2.关键字
3.函数
4.内置命令
5.脚本或可执行程序
根据这个优先顺序,如果存在一个命令或脚本名字跟内建命令名字一致,command是无效的。
再试验一下,创建一个cd脚本并给执行权限。
cd是一个内建命令,用来进入指定的目录。
如下图:
从上图得到结论,虽然使用了command命令但是cd脚本没有执行。执行的是cd命令。
如果要禁止cd这个内建命令,可以使用enable来实现,如下图:
如图可知,cd命令没有执行。如果需要恢复使用enable命令如下:
enable cd
另外还有一个builtin命令,它的作用是只调用内建命令。
如果先使用enable禁用,在使用builtin窒息功能被禁用的内建命令,结果是啥?有兴趣的朋友自己试试。