為什麼 echo 是內置命令的 shell?
$ which echo echo: shell built-in command. $ which ls /bin/ls $ which cat /bin/cat
ls
為什麼 echo 不是像,ps
等這樣的獨立實用程序cat
?為什麼它是特定於外殼的?有什麼好的理由嗎?
有兩類內置函式:
- 有些命令必須內置到 shell 程序本身中,因為如果它們是外部的,它們就無法工作。
cd
就是這樣一個,因為如果它是外部的,它只能更改自己的目錄;它不會影響 shell 的目前工作目錄。(另見:為什麼cd
不是程序?) 2. 另一類命令純粹是為了提高效率而內置在 shell 中的。手冊頁有一個關於 builtins的部分,其中提到、和作為此類命令的範例。
dash
printf``echo``test
Unix 系統總是為第二類中的命令包含單獨的執行檔。這些單獨的執行檔在我使用過的每個 Unixy 系統上仍然可用,即使它們也內置在您可能使用的每個 shell 中。(POSIX實際上要求這些執行檔存在。)
我相信
echo
在 AT&T Unix System V Release 3.1 中內置了外殼。我基於對 AT&Ts 3B1 系列 Unix 系統的兩個不同版本的手冊進行比較。有人好心掃描了這些手冊的1986版並放到網上;這些對應於 SVR3 的原始版本。您可以看到它echo
不在UNIX System V User’s Manual, Volume II 的第 523 頁的列表中,如果該命令內置到 shell 中,您會期望它在該列表中。在我本地的 1987 年 SVR3.1 手冊的紙質副本中,echo
列在手冊的本節中。我很確定這不是AT&T 帶回家的伯克利CSRG創新。4.3BSD 於 1986 年與 SVR3 同年問世,但如果您查看4.3BSD 的 sh.1 手冊頁,您會發現它
echo
不在“特殊命令”部分的內置命令列表中。如果 CSRG 這樣做了,那我們就需要有據可查的來源來證明這一點。在這一點上,您可能想知道是否
echo
在 SVR3.1 之前就內置到了 shell 中,並且直到那時這個事實才被記錄在案。我可以使用的最新的 pre-SVR3 AT&T Unix 原始碼位於PDP-11 System III tarball中,您可以在其中找到 Bourne shell 原始碼。您不會echo
在內置命令表中找到/usr/src/cmd/sh/msg.c
. 根據該文件中的時間戳,這證明它echo
肯定不在 1980 年的 shell 中。瑣事
同一個目錄還包含一個名為的文件,該文件
builtin.c
不包含該問題的任何相關內容,但我們確實發現了這個有趣的評論:/* builtin commands are those that Bourne did not intend to be part of his shell. Redirection of i/o, or rather the lack of it, is still a problem.. */