
現在のシェルでこれらのコマンドを実行するか、またはそれらを内部に配置する状況を考えてみましょう.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 を使用して関数を設定解除できます。PATH
command
unset -f source
builtin
、および のすべてを上書きcommand
または無効にした場合unset
、このシェル インスタンスを適切な状態に復元するという考えを放棄する必要があるかもしれません。