シェルに組み込まれているコマンドは、パフォーマンスが向上するために組み込まれることがよくあります。たとえば、外部の 呼び出しはprintf
、組み込みの呼び出しを使用するよりも遅くなりますprintf
。
一部のユーティリティは組み込みである必要がないため、などの特別なものでない限り、外部ユーティリティcd
としても提供されています。これは、組み込みの同等の機能を提供しないシェルによってスクリプトが解釈されてもスクリプトが壊れないようにするためです。
一部のシェルのビルトインは、外部の同等のコマンドに対する拡張機能も提供します。printf
たとえば、バッシュは
$ printf -v message 'Hello %s' "world"
$ echo "$message"
Hello world
(変数に出力します)/usr/bin/printf
現在のシェルセッションのシェル変数にアクセスできないため(そしてそれらを変更できないため)、外部では実行できません。
組み込みユーティリティには、拡張されたコマンドラインを特定の長さよりも短くする必要があるという制限もありません。している
printf '%s\n' *
したがってprintf
、シェルの組み込みコマンドであれば安全です。コマンドラインの長さの制限は、execve()
外部コマンドの実行に使用されるCライブラリ関数に起因します。コマンドラインと現在の環境がARG_MAX
バイトよりも大きい場合(getconf ARG_MAX
シェルを参照)、への呼び出しexecve()
は失敗します。ユーティリティがシェルに組み込まれている場合は、execve()
呼び出す必要はありません。
組み込みユーティリティは、にあるユーティリティよりも優先されます$PATH
。の組み込みコマンドを無効にするにはbash
、例えば
enable -n printf
シェルに組み込む必要のあるユーティリティの短いリストがあります(POSIX標準の特別な組み込みのリストから取得)
break
colon (:)
continue
dot (.)
eval
exec
exit
export
readonly
return
set
shift
times
trap
unset
これらは、現在のシェルセッションの環境とプログラムフローを直接操作するため、組み込みが必要です。外部のユーティリティはそれを行うことができません。
興味深いことに、cd
これはこのリストの一部ではありませんが、POSIX はそのことについて次のように述べています。
以来cd
、現在のシェル実行環境に影響を与え、それが常に内蔵のシェルレギュラーとして提供されます。サブシェルまたは別のユーティリティ実行環境(次のいずれかなど)で呼び出された場合:
(cd /tmp)
nohup cd
find . -exec cd {} \;
呼び出し元の環境の作業ディレクトリには影響しません。
したがってcd
、理論的には可能ですが、「特別な」ビルトインには外部の対応物を含めることはできないと想定しています(ただし、あまり機能しません)。