linux 命令执行详解

在学习 刘遄老师的书时 遇到一些问题 不是很理解,百度后,写下这份总结

------------------------书籍原文---------------------------------------------------

-------------------------------------------------------------------------------------

前文中曾经讲到,在 Linux 系统中一切都是文件,Linux 命令也不例外。那么,在用

户执行了一条命令之后,Linux 系统中到底发生了什么事情呢?简单来说,命令在 Linux 中的

执行分为 4 个步骤。

第一步:判断用户是否以绝对路径或相对路径的方式输入命令(如/bin/ls),如果是的话

则直接执行。

第二步:Linux 系统检查用户输入的命令是否为“别名命令”,即用一个自定义的命令

名称来替换原本的命令名称。可以用 alias 命令来创建一个属于自己的命令别名,格式为

“alias 别名=命令”。若要取消一个命令别名,则是用 unalias 命令,格式为“unalias 别名”。

我们之前在使用 rm 命令删除文件时,Linux 系统都会要求我们再确认是否执行删除操作,

其实这就是 Linux 系统为了防止用户误删除文件而特意设置的 rm 别名命令,接下来我们

把它取消掉:

```

[root@linuxprobe ~]# ls

anaconda-ks.cfg Documents initial-setup-ks.cfg Pictures Templates

Desktop Downloads Music Public Videos

[root@linuxprobe ~]# rm anaconda-ks.cfg

rm: remove regular file ‘anaconda-ks.cfg’? y

[root@linuxprobe~]# alias rm

alias rm='rm -i'

[root@linuxprobe ~]# unalias rm

[root@linuxprobe ~]# rm initial-setup-ks.cfg

[root@linuxprobe ~]#

```

第三步:Bash 解释器判断用户输入的是内部命令还是外部命令。内部命令是解释器内部

的指令,会被直接执行;而用户在绝大部分时间输入的是外部命令,这些命令交由步骤 4 继

续处理。可以使用“type 命令名称”来判断用户输入的命令是内部命令还是外部命令。

第四步:系统在多个路径中查找用户输入的命令文件,而定义这些路径的变量叫作 PATH,可

以简单地把它理解成是“解释器的小助手”,作用是告诉 Bash 解释器待执行的命令可能存放

的位置,然后 Bash 解释器就会乖乖地在这些位置中逐个查找。PATH 是由多个路径值组成的

变量,每个路径值之间用冒号间隔,对这些路径的增加和删除操作将影响到 Bash 解释器对

Linux 命令的查找。

[root@linuxprobe ~]# echo $PATH

/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin

[root@linuxprobe ~]# PATH=$PATH:/root/bin

[root@linuxprobe ~]# echo $PATH

/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin:/root/bin

这里有比较经典的问题:“为什么不能将当前目录(.)添加到 PATH 中呢? ” 原因是,

尽管可以将当前目录(.)添加到 PATH 变量中,从而在某些情况下可以让用户免去输入命令

所在路径的麻烦。但是,如果黑客在比较常用的公共目录/tmp 中存放了一个与 ls 或 cd 命令同名的木马文件,而用户又恰巧在公共目录中执行了这些命令,那么就极有可能中招了。

--------------------------------------------------------------------------------------------------------------------------------------------------

针对第三步 内部命令和外部命令 做出如下拓展解释

内建命令又称内部命令实际上是 shell 程序的一部分,其中包含的是一些比较简单的 Linux 系统命令,这些命令是写在bash源码的builtins里面的,由 shell 程序识别并在 shell 程序内部完成运行,通常在 Linux 系统加载运行时 shell 就被加载并驻留在系统内存中。而且解析内部命令 shell 不需要创建子进程,因此其执行速度比外部命令快。比如:history、cd、exit 等等。 可以通过help查看内部命令

外部命令是 Linux 系统中的实用程序部分,因为实用程序的功能通常都比较强大,所以其包含的程序量也会很大,在系统加载时并不随系统一起被加载到内存中,而是在需要时才将其调入内存。虽然其不包含在 shell 中,但是其命令执行过程是由 shell 程序控制的。外部命令是在 Bash 之外额外安装的,通常放在/bin,/usr/bin,/sbin,/usr/sbin等等。比如:ls、vi等。

简单来说就是:一个是天生自带的天赋技能,一个是后天得来的附加技能。我们可以使用 type 命令来区分命令是内建的还是外部的。例如这两个得出的结果是不同的

使用type+命令 可以区分内部和外部命令

标准输出有以下三种情况

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容