一部のコマンドは、組み込みコマンドと外部ユーティリティの両方で提供されます。たとえばecho
。 Bash 3.2を実行しているマイコンピュータ(macOS)では、
$ type echo
echo is a shell builtin
実行中のman bash | less --pattern='^ *echo +\['
プログラム:
echo [-neE] [arg ...]
ただし、実行すると、さまざまな署名を使用してman 1 echo
さまざまな実装のマニュアルページが表示されますecho
。
echo [-n] [string ...]
正常に使用できたので、組み込みを実行する必要が-e
ありました。/bin/echo
$ which echo
/bin/echo
他の実装はどこにあり、組み込み機能と外部ユーティリティ(たとえばprintf
)をどのように区別できますか?
アップデート/修正説明してくれた@Gillesに感謝します。その証拠はプリンにあります!
$ /bin/echo -e "\tabc"
-e \tabc
$ echo -e "\tabc"
abc
ベストアンサー1
コマンドが組み込まれていることを確認するには、を実行しますtype
。
$ type echo
echo is a shell builtin
type
独自に組み込まれたコマンドなので、どのコマンドが組み込まれているかを知っています。 (Bashは組み込みコマンドを無効にすることができ、組み込みtype
コマンドが無効になっていると、そのコマンドは組み込みではないと正しく報告されます。)type
コマンドを使用すると、コマンドは実行するすべての項目の名前を報告します。 - エイリアス、関数、組み込みまたは外部コマンド。
which
外部コマンドの位置を報告する外部コマンドです。エイリアス、関数、または組み込み関数については何も知りません。設定によっては、正しい外部コマンドを報告しないことがあります。ただ忘れてwhich
使ってくださいtype
。
次の組み込みプログラムを実行する必要があります。
/bin/echo
いいえ!定義によると、組み込みコマンドは外部コマンドではありません。他のすべての組み込み関数と同様に、組み込み関数を実装するコードは、組み込みコマンドと同じ名前の外部コマンドにecho
あります。/bin/bash
/bin/echo
echo
コマンドが組み込みコマンドと外部コマンドの両方に存在する場合、組み込みコマンドはその名前を使用して呼び出されます。順番にリストされているディレクトリのコマンド名の優先順位は、エイリアス、関数、組み込みコマンド、外部コマンドです$PATH
。何らかの理由で外部コマンドを強制的に実行するには、そのコマンドのフルパスを使用してください。