Linux ~ 命令执行时,系统是怎么知道命令在哪的?

我们知道 Linux 中一切皆文件,那么命令当然也是一个文件了,那么比如我们执行一个 ls 命令时,系统是怎么知道这个 ls 命令的二进制文件在哪呢?

下面我们来分析系统是怎么一步步找到对应的命令文件:

1、如果用户输入的是一个绝对路径的命令,比如 /bin/ls ,那么就是直接执行了。 如果是相对路径,则进入第2步。

2、检查用户输入的命令是否是一个别名命令,比如 rm ,其实就是一个别名,真正要执行的命令是 rm -i

3、bash解释器,判断这个命令是否是内建命令,如果是bash内置的,则直接执行。 如果是外部命令,则进入第4步。

我们可以用 type 命令 来得知这个命令是内建的,还是外部的。

type echo
type uptime

4、bash解释器,从 PATH 环境变量中,获取多个地址,然后从前往后,在这些地址中,挨个的寻找命令文件,如果找到了,就终止寻找,然后用这个二进制文件来作为命令执行。

echo $PATH
/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/root/bin    // 可以看出,用 :  分割的多个地址

// 我们可以修改 PATH
PATH=$PATH:/root/bin

// 再次查看
echo $PATH
/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/root/bin:/root/bin

当然了,增加或删除 PATH 中的地址,会直接影响到 bash解释器 对命令的查找。

注意:对应环境变量,一般不要轻易更改,除非你知道自己在做什么?

一个经典问题:为什么不要将 . (当前目录) ,添加到 PATH 中 ?

我们确实可以将 . 加入到 PATH 中,然后当前目录下的命令,不用路径就可以直接输入了,看起来好像确实有点用。 但是这样会导致系统不安全, 加入 /tmp/ 下有个 ls 的木马文件, 当我们在 /tmp/ 下执行 ls 时, 那么就是直接执行了这个木马文件了。

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇