web-dev-qa-db-ja.com

なぜ/ bin / echoがあり、なぜそれを使用したいのですか?

Ubuntu MATE 17.04システムに/bin/echoというバイナリ実行可能ファイルがあることに気付きました。

奇妙だと思った

$ type echo
echo is a Shell builtin

大まかなテストでは、/bin/echoがBashビルトインechoと同じ種類のことを行うことが示唆されています。

$ /bin/echo foo
foo
$ /bin/echo $USER
zanna

それで、なぜBashプログラムとは別のechoのバージョンがあり、なぜそれをいつ使用したいのですか?

52
Zanna

Eliahはこれに答えてくれましたが、「Bashプログラムとは別のechoのバージョンがあるのはなぜですか」という部分についてコメントしたいと思います。それは間違った質問です。

正しい質問は次のとおりです。 なぜこれが最初にビルトインであるのか 、それが完全に素晴らしい外部コマンドであった可能性がある(そしてそうである)とき?

簡単にするために、ダッシュの組み込みを見てみましょう。わずか38(bashは61で、比較のためにcompgen -bの出力を通ります):

.               continue        getopts         readonly        type
:               echo            hash            return          ulimit
[               eval            jobs            set             umask
alias           exec            kill            shift           unalias
bg              exit            local           test            unset
break           export          printf          times           wait
cd              false           pwd             trap
command         fg              read            true

これらのがいくつ組み込まれている必要がありますか[echofalseprintfpwdtest、およびtrueしないneedビルトインにする:ビルトインだけができることはしません(外部コマンドでは利用できないシェル状態に影響を与えたり取得したりします)。 Bashのprintfは、少なくとも組み込みであるという利点を活用しています。printf -v varは、出力を変数varに保存します。 bashのtimeも特別です。キーワードになることで、bashの任意のコマンドリストの時間を計ることができます(ダッシュにはtimeに相当するものはありません)。 pwdも組み込みである必要はありません-外部コマンドは現在の作業ディレクトリを継承します(そして external command でもあります)。 :は例外です-NOPが必要で、:が必要です。残りは、外部コマンドが簡単に実行できるアクションを実行します。

したがって、これらの組み込み関数の5分の1は組み込み関数である必要はありません。どうして? dashのマンページ *は、これらが組み込みである理由(エンファシスマイニング)を実際に説明しています。

Builtins 
このセクションでは、個別の
プロセスでは実行できない操作を実行する必要があるため、組み込みコマンドをリストします。これらに加えて、効率のために組み込み可能な
の他のコマンドがいくつかあります(たとえば、printf(1)、echo(1)、test(1)など)。

それだけです。これらのビルトインは、インタラクティブにスクリプトで頻繁に使用され、シェルが機能できるほど機能がシンプルであるために存在します。そして、それは起こります:いくつかの(ほとんどの?)シェルが仕事を引き受けました。** the sh から 2.9 BSD に戻ります。 echoビルトインを見つけます。

したがって、最小限のシェルでこのようなコマンドをビルトインとして実装することをスキップできる可能性は完全にあります(ただし、現在のシェルはそうではないと思います)。 GNU coreutilsプロジェクトは、特定のシェルで実行することを想定していません。POSIXではこれらのコマンドが必要です。そのため、coreutilsはいずれにしてもこれらを提供し、シェル以外では意味を持たないものはスキップします。


*これは、 Almquist Shellの対応するマンページテキスト とほぼ同じです。これは、Deash Almquist Shellのダッシュボードが基づいているものです。

** zshはこの考え方を極限まで取り入れています。さまざまなモジュールをロードすることで取得するコマンド(zmvなど)、 シェルが入る必要さえないと思われるものです 。その時点で、本当の問題は次のとおりです。これらのすべてのビルトインを備えたzshの代わりにbashを使用する理由

31
muru