web-dev-qa-db-ja.com

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

これらのコマンドを現在のシェルで実行するか、_.bashrc_内に配置する状況を考えてみます。

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

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

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

2
Ravexina

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
6
ilkkachu

エイリアスは、コマンド名の任意の部分を引用することでいつでもバイパスできます。 \sourceまたは'source'または''sourceまたは…(他のシェルではなく、zshで許可されているエイリアスも定義していない限り)。

関数はcommandプレフィックスでバイパスできます(例:command source)任意のPOSIXシェル。 bashまたはzshでは、builtinの代わりにcommandを使用して、ビルトインの使用を強制できます(ビルトインがない場合、commandPATHルックアップにフォールバックしますその名前で、zshでは(他のシェルをエミュレートする場合を除く)、commandは組み込みを完全にスキップします)。たとえば、関数の設定を解除できます。 unset -f source

builtincommand、およびunsetのすべてをオーバーライドまたは無効にした場合は、このシェルインスタンスを適切な状態に復元するという考えを放棄する必要があります。