Shell

為什麼 echo 是內置命令的 shell?

  • February 19, 2017
$ which echo
echo: shell built-in command.
$ which ls
/bin/ls
$ which cat
/bin/cat

ls為什麼 echo 不是像,ps等這樣的獨立實用程序cat?為什麼它是特定於外殼的?有什麼好的理由嗎?


有兩類內置函式:

  1. 有些命令必須內置到 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..
*/      

引用自:https://unix.stackexchange.com/questions/1355