関数はbash / shellスクリプト言語に組み込まれているコマンドと同じですか?

関数はbash / shellスクリプト言語に組み込まれているコマンドと同じですか?

はい

$ echo "This is great"
This is great
$ num2=2
$ num3="Three"
$ echo $num2
2
$ echo $num3
Three

エコーをオーバーライドします。

$ echo(){ command echo "The command was redefined"; }
$ echo $num2
The command was redefined
$ echo $?
The command was redefined

それではこれは本当ですか? Unixシェルのすべてのコマンドを実行でき、このように動作できますか?

答え1

いいえ。組み込み機能は関数と同じ名前空間を介してアクセスできますが、まだ別のエンティティであり、関数によって非表示になっても組み込みコマンドを介してbuiltinアクセスできます(もちろん、楽しさを増やすために上書きすることもできますbuiltin☺)。また、unset -f echo内蔵機能を元の状態に戻す場合は注意してください。

名前が示すように、組み込み関数も組み込まれ、ファイルから生成されたCコード(bashの場合)として実装されます。echo.def

答え2

いいえ、すべてのUnixコマンドはシェル機能ではなく、シェル機能に置き換えることができます。

シェル関数名は、組み込みまたは外部ユーティリティ名に限定されません。異なるパスに同じ名前を持つ複数の外部ユーティリティがある場合があるように、同じ名前のシェル関数またはエイリアスがある可能性があります。

関数が呼び出され、foo外部または組み込みユーティリティも呼び出されると、fooその関数が呼び出されます。foo

シェルに組み込みユーティリティを選択させるには、次のようにします。

builtin foo

この機能を無効にするには、foo以下を使用します。

command foo

シェル関数、エイリアス、または組み込みユーティリティの代わりに外部ユーティリティを使用するには、フルパスを使用します。たとえば、次のようになります。

/bin/echo

エイリアスと関数は同じ名前空間を占めるため、エイリアスと関数は同じ名前を持つことはできません。


簡単に言うと:

Unix コマンドは次のようになります。

  • エイリアスまたは
  • シェル機能または
  • シェルに組み込まれたユーティリティ、または
  • 外部ユーティリティ(コンパイルされたバイナリまたはスクリプト言語で書かれたスクリプト)。

いくつかの「コマンド」はコマンドではなく、forなどifのキーワードです。これは、よりエキサイティングなシェル体験のためにエイリアスとシェル関数に置き換えることができます(つまり、これをしないでください)。

関連情報