シェルの組み込みコマンドを具体的に実行する方法

シェルの組み込みコマンドを具体的に実行する方法

現在のシェルでこれらのコマンドを実行するか、またはそれらを内部に配置する状況を考えてみましょう.bashrc:

alias source='echo hi'
alias .='echo hi'
alias unalias='echo hi'

またはfunction source(){ echo hi; }、など。

バイナリ コマンドの場合は、次のような絶対パスを使用できます。/bin/lsただし、現在のシェル内でこれらのシェル組み込みコマンドを具体的に実行するにはどうすればよいですか?

答え1

Bash にはそのためのコマンドがありますbuiltin:

builtin: builtin [shell-builtin [arg ...]]
Execute shell builtins.

Execute SHELL-BUILTIN with arguments ARGs without performing command
lookup.  

例えば

$ cat > hello.sh
echo hello
$ source() { echo x ; }
$ source hello.sh
x
$ builtin source hello.sh
hello

ただし、を上書きすることを妨げるものは何もありませんbuiltin

エイリアス (関数ではない) を回避する別の方法は、単語 (の一部) を引用符で囲むことです。

$ alias source="echo x"
$ source hello.sh 
x hello.sh
$ \source hello.sh
hello

答え2

エイリアスは、コマンド名の一部を引用符で囲むことでいつでもバイパスできます (例:\sourceまたは または'source'または''source…) (これらにもエイリアスを定義している場合は除きます。これはzsh他のシェルでは許可されません)。

commandどの POSIX シェルでも、プレフィックス (例command source) を使用して関数をバイパスできます。bash または zsh ではbuiltin、 の代わりに を使用してcommand、組み込み関数の使用を強制できます (その名前の組み込み関数がない場合は検索commandに戻り、zsh では (他のシェルをエミュレートする場合を除く)、組み込み関数を完全にスキップします)。eg を使用して関数を設定解除できます。PATHcommandunset -f source

builtin、および のすべてを上書きcommandまたは無効にした場合unset、このシェル インスタンスを適切な状態に復元するという考えを放棄する必要があるかもしれません。

関連情報