好奇心から、この関数を作成したとしましょう。
cd () { echo 'hi'; }
これで、入力するたびcd
に「hi」が印刷されます。元のコマンドを使用したい場合cd
は、次のようにすることができます。
builtin cd
しかし、これも作成した場合はどうなりますか?
builtin() { echo 'haha, got ya!'; }
では、またはの組み込みコマンドをどのように取得しますbuiltin
かcd
?
好奇心から、この関数を作成したとしましょう。
cd () { echo 'hi'; }
これで、入力するたびcd
に「hi」が印刷されます。元のコマンドを使用したい場合cd
は、次のようにすることができます。
builtin cd
しかし、これも作成した場合はどうなりますか?
builtin() { echo 'haha, got ya!'; }
では、またはの組み込みコマンドをどのように取得しますbuiltin
かcd
?
builtin
まず最初に、コマンドをオーバーライドしないでください。これは、意図的に実行していないと思います。すべてのビルトインをオーバーライドできるという事実を考慮して、私はもっとばかげたルートを考えました:
#!/bin/bash
builtin() { echo "Ha"; }
cd() { echo "Ha"; }
pwd() { echo "foobar"; }
result=$(/bin/bash --noprofile --norc -c "\\cd /home/cwgem/testdir; \\pwd; \\ls" )
/bin/echo "$result"
結果:
$ bash test.sh
/home/cwgem/testdir
test.txt
ここでの考え方は次のとおりです。
/bin/bash
関数としてオーバーライドできない関数への絶対パスを使用します(もちろん、これは、とをいじり回さないことを前提としています/bin/echo
)$()
そして私はそれをオーバーライドすることができませんでしたbash
と--noprofile
、--norc
オーバーライドが含まれている可能性のある通常のファイルをソーシングしないことを明示します。\
、エイリアスが浮かんでいる場合に備えて、コマンドの前に'が追加されますとは言うものの、このハックはすべて学術的な好奇心から行われたものであり、現実の世界に適用すべきではありません。
unset
この質問を書き留めている間、私はコマンドについて思い出しました。他の誰かが知りたい場合は、次のことができます。
unset builtin
と
unset cd
元のコマンドを期待どおりに機能させるため。メソッドの設定を解除せずにそうする方法があれば、その方法を知りたいと思います。
もう1つのオプションはenv -i
、エイリアスと関数を使用して環境を取り除くために使用することです。
builtin() { echo 'haha, got ya!'; }
builtin pwd
/usr/bin/env -i bash -c 'builtin pwd'