はい
$ 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
のキーワードです。これは、よりエキサイティングなシェル体験のためにエイリアスとシェル関数に置き換えることができます(つまり、これをしないでください)。