組み込みユーティリティと外部ユーティリティを区別する方法は? (例:エコ)

組み込みユーティリティと外部ユーティリティを区別する方法は? (例:エコ)

一部のコマンドは、組み込みコマンドと外部ユーティリティの両方で提供されます。たとえば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/echoecho

コマンドが組み込みコマンドと外部コマンドの両方に存在する場合、組み込みコマンドはその名前を使用して呼び出されます。順番にリストされているディレクトリのコマンド名の優先順位は、エイリアス、関数、組み込みコマンド、外部コマンドです$PATH。何らかの理由で外部コマンドを強制的に実行するには、そのコマンドのフルパスを使用してください。

おすすめ記事