你有没有在电脑上打开终端,敲下一条像 ls 或 pwd 这样的命令,然后回车就看到结果?看起来简单,其实背后有一套完整的流程在跑。想知道 shell 命令是怎么一步步运行起来的吗?咱们来拆解一下。
你敲下的命令去哪儿了
当你在终端里输入 ls -l /home 并按下回车,shell(比如 bash 或 zsh)就开始工作了。它先读取你输入的内容,然后进行分词——把命令拆成程序名和参数:ls 是要运行的程序,-l 和 /home 是它的参数。
查找命令的位置
shell 不会直接知道 ls 在哪儿,它得自己找。系统里有个叫 PATH 的环境变量,里面存着一堆目录路径,比如 /usr/bin、/bin、/usr/local/bin。shell 就按顺序去这些目录里找有没有叫 ls 的可执行文件。
你可以看看自己的 PATH 设置:
echo $PATH
如果找到了,就准备执行;没找到,就会报错 command not found。
程序是怎么跑起来的
找到可执行文件后,shell 会调用操作系统的一个功能叫 fork(),复制出一个子进程。接着在这个子进程里调用 exec(),把 ls 程序加载进来,替换掉原来复制出来的进程内容。这时候,ls 就真正开始运行了。
比如你输入:
ps aux | grep ssh
这其实是两个命令通过管道连接。shell 会分别启动 ps 和 grep 两个进程,并把前一个的输出接到后一个的输入上,实现数据传递。
内置命令的特殊情况
有些命令不是独立程序,而是 shell 自己“内置”的,比如 cd 和 export。它们不需要去文件系统里找,因为由 shell 直接处理。比如 cd 改变的是当前 shell 的工作目录,如果它是一个外部程序,改完就退出了,根本影响不到你所在的终端。
脚本命令也能这么跑
你写的 shell 脚本,比如 backup.sh,只要加上可执行权限,也可以像普通命令一样运行。
chmod +x backup.sh
./backup.sh
系统会读取脚本第一行的 #!(shebang),比如 #!/bin/bash,然后用指定的解释器去执行它,整个过程和运行内置或外部命令一脉相承。
说到底,shell 命令的运行就是“解析→查找→启动”的过程。搞明白这套机制,下次遇到命令找不到或者执行异常,就知道该往哪儿查了。