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
のバージョンがあり、なぜそれをいつ使用したいのですか?
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
これらのがいくつ組み込まれている必要がありますか? [
、echo
、false
、printf
、pwd
、test
、および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を使用する理由