Eliahはこれに答えてくれましたが、「なぜecho
Bashプログラムとは別のバージョンがありますか」という部分についてコメントしたいと思います。それは間違った質問です。
正しい質問は、なぜこれが完全に素晴らしい外部コマンドであったかもしれない(そしてそうである)のにそもそも組み込みなのでしょうか?
簡単にするために、ダッシュのビルトイン、わずか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
していない必要があるビルトインする:彼らは唯一の組み込みを行うことができます何もしない(外部コマンドを利用できないシェルの状態に影響を与えたり、入手)。Bash printf
は少なくとも組み込みであるという利点を活用printf -v var
しますvar
。出力を変数に保存します。time
bashの特別な機能もあります。キーワードであるため、bashで任意のコマンドリストの時間を計ることができます(dashにはtime
同等のものはありません)。pwd
組み込みコマンドである必要もありません-外部コマンドは現在の作業ディレクトリを継承します(そして外部コマンドでもあります)。:
例外です-NOPが必要:
です。残りは、外部コマンドが簡単に実行できるアクションを実行します。
したがって、これらの組み込み関数の5分の1は組み込み関数である必要はありません。どうして?manページには、 *実際にこれらはビルトイン(強調鉱山)である理由を渡しに説明します。dash
ビルトイン
このセクションでは、組み込みコマンドをリストします。
個別には実行できない操作を実行する必要がある
処理する。これらに加えて、いくつかのコマンドがあります。
効率のために組み込みます(たとえば、printf(1)、echo(1)、test(1)など)。
それだけです。これらのビルトインは、インタラクティブに、スクリプトで頻繁に使用され、シェルがその機能を果たすことができるほど簡単に機能するためです。それが起こるように:。いくつかの(?ほとんどの)シェルはに仕事に**囲碁バックを取ったから2.9 BSD、あなたは見つけることができません組み込みを。sh
echo
そのため、最小限のシェルでこのようなコマンドを組み込みコマンドとして実装することをスキップできる可能性があります(ただし、現在のシェルはそうではないと思います)。GNU coreutilsプロジェクトは、特定のシェルで実行することを想定していません。POSIXにはこれらのコマンドが必要です。そのため、coreutilsはいずれにしてもこれらを提供し、シェル以外では意味を持たないものはスキップします。
*これは、Almquistシェルの対応するマンページテキストとほぼ同じです。これは、Debian Almquistシェルであるdashのベースとなっているものです。
** zsh
極端にこのアイデアを取る:あなたは様々なモジュールをロードすることで取得するコマンド、のようなzmv
、あなたはシェルの必要性も入ると思わないだろうものです。その時点で、本当の問題は次のとおりです。これらすべてのビルトインを持つzshの代わりにbashを使用する理由は何ですか?