これらのコマンドを現在のシェルで実行するか、_.bashrc
_内に配置する状況を考えてみます。
_alias source='echo hi'
alias .='echo hi'
alias unalias='echo hi'
_
またはfunction source(){ echo hi; }
など。
バイナリコマンドの場合、_/bin/ls
_のような絶対パスを使用できますが、現在のシェル内でこれらのシェル組み込みコマンドを具体的に実行するにはどうすればよいですか?
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
をオーバーライドすることを妨げるものは何もありません。
エイリアス(関数ではない)を回避する別の方法は、Word(の一部)を引用することです。
$ alias source="echo x"
$ source hello.sh
x hello.sh
$ \source hello.sh
hello
エイリアスは、コマンド名の任意の部分を引用することでいつでもバイパスできます。 \source
または'source'
または''source
または…(他のシェルではなく、zsh
で許可されているエイリアスも定義していない限り)。
関数はcommand
プレフィックスでバイパスできます(例:command source
)任意のPOSIXシェル。 bashまたはzshでは、builtin
の代わりにcommand
を使用して、ビルトインの使用を強制できます(ビルトインがない場合、command
はPATH
ルックアップにフォールバックしますその名前で、zshでは(他のシェルをエミュレートする場合を除く)、command
は組み込みを完全にスキップします)。たとえば、関数の設定を解除できます。 unset -f source
。
builtin
、command
、およびunset
のすべてをオーバーライドまたは無効にした場合は、このシェルインスタンスを適切な状態に復元するという考えを放棄する必要があります。