linux命令搜寻

命令搜寻的原则是先到先得

1:判断用户是否以绝对路径或相对路径的方式输入命令(如/bin/ls),如果是的话则直接执行。

2:Linux系统检查用户输入的命令是否为“别名命令”,即用一个自定义的命令名称来替换原本的命令名称。可以用alias命令来创建一个属于自己的命令别名,格式为“alias 别名=命令”。若要取消一个命令别名,则是用unalias命令,格式为“unalias 别名”。

3:判断是否为关键字(keyword)然后在判断是否为函数(function)(这种情况一般出现于脚本文件中)

4步:Bash解释器判断用户输入的是内部命令还是外部命令。内部命令是解释器内部的指令,会被直接执行;而用户在绝大部分时间输入的是外部命令,这些命令交由步骤5继续处理。可以使用“type命令名称”来判断用户输入的命令是内部命令还是外部命令。

5:系统在多个路径中查找用户输入的命令文件,而定义这些路径的变量叫作PATH,可以简单地把它理解成是“解释器的小助手”,作用是告诉Bash解释器待执行的命令可能存放的位置,然后Bash解释器就会乖乖地在这些位置中逐个查找。PATH是由多个路径值组成的变量,每个路径值之间用冒号间隔,对这些路径的增加和删除操作将影响到Bash解释器对Linux命令的查找。但是如果hash中有缓存的话则不会进行路径搜索

总的来说就是:

alias->keyword->function->built-in->hash缓存->$PATH

 

这里有比较经典的问题:“为什么不能将当前目录(.)添加到PATH中呢? ” 原因是,尽管可以将当前目录(.)添加到PATH变量中,从而在某些情况下可以让用户免去输入命令所在路径的麻烦。但是,如果黑客在比较常用的公共目录/tmp中存放了一个与ls或cd命令同名的木马文件,而用户又恰巧在公共目录中执行了这些命令,那么就极有可能中招了。

 

针对一些场景,有时候我们或许会不希望命令搜寻按照原有的顺序执行,以下是一些命令可以帮助我们实现这个目的:

 

command:

如果出现命令名字和function名字一样的情况,可以使用command:

如果你有一个命令如gcc既是一个function, 同时又是一个PATH变量中的命令, 那么如果你直接执行gcc, 按照顺序来说, 会执行function而不是gcc的PATH变量中的命令, 而用command gcc会跳过function的选择.

builtin:执行内置命令

如:function pwd { echo “just a test for pwd”; }

 type -a pwd

pwd is a function

pwd ()

{

echo “just a test for pwd”

}

pwd is a shell builtin

pwd is /bin/pwd

pwd既是函数, 又是内置命令, 又存在PATH变量中

使用builtin pwd即可执行内部命令

 

 

参考资料:

<<linux就该这么学>>

网上各路博文

点赞

发表评论

电子邮件地址不会被公开。