一部のコマンドは、組み込みコマンドと外部ユーティリティの両方で提供されます。たとえば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
。何らかの理由で外部コマンドを強制的に実行するには、そのコマンドのフルパスを使用してください。
答え2
既知の名前(単語)
word
(単語がエイリアス、関数、またはコマンドの有効な名前であると仮定する場合)提供する項目を見つけるための最良の方法は、-a
次のオプションを使用することですtype
。
$ type -a echo
echo is a shell builtin
echo is /bin/echo
関数とエイリアスも定義されている場合は、次のようなリストが表示されることがあります。
$ type -a echo
echo is aliased to `echo "A new echo"'
echo is a function
echo ()
{
printf '%s\n' "A function echo" "$@"
}
echo is a shell builtin
echo is /bin/echo
印刷された順序が優先されます。上記の印刷リストでは、エイリアスが最初に実行されます。この関数はalias(unalias
)が削除されたときに実行されます。その他など
例:
$ echo "test"
A function echo
A new echo
test
引用は一般にエイリアスをバイパスします。
$ \echo # or "e"cho, "echo", 'e'"ch"o, and many other variations.
A function echo
test
これは、エイリアスを設定解除するのと同じです。
$ unalias echo; echo test
A function echo
test
この機能は設定解除(オプション-f)で削除できます。
$ unset -f echo
$ type -a echo
echo is a shell builtin
echo is /bin/echo
以下を有効にしてエイリアスをオフにできます。
$ enable -n echo
$ type -a echo
echo is /bin/echo
また、外部(シェル外部)ユーティリティを移動することもできます。
# mv /bin/echo /bin/echo-aside
# type -a echo
bash: type: echo: not found
組み込み関数一覧
組み込み関数の名前が不明な場合は一覧表示できます。
enable
Bashには(builtin
in)という奇妙な名前のコマンドがありますksh
。オプションなしで
呼び出すと、組み込み関数のリストenable
が印刷されます。enabled
$ enable
enable .
enable :
enable [
enable alias
…
-a
すべて印刷()、有効化のみ有効(-p
または何も印刷しない)、および特別な(Posix定義)組み込み()オプションがあります-s
。
「enable」という単語を削除し、1行のリストにします。
$ echo $(enable -s | cut -d" " -f2)
. : break continue eval exec exit export readonly return set shift source times trap unset
$ echo $(enable -p | cut -d" " -f2)
. : [ alias bg bind break builtin caller cd command compgen complete compopt continue declare dirs disown echo enable eval exec exit export false fc fg getopts hash help history jobs kill let local logout mapfile popd printf pushd pwd read readarray readonly return set shift shopt source suspend test times trap true type typeset ulimit umask unalias unset wait