2

好奇心から、この関数を作成したとしましょう。

cd () { echo 'hi'; }

これで、入力するたびcdに「hi」が印刷されます。元のコマンドを使用したい場合cdは、次のようにすることができます。

builtin cd

しかし、これも作成した場合はどうなりますか?

builtin() { echo 'haha, got ya!'; }

では、またはの組み込みコマンドをどのように取得しますbuiltincd

4

3 に答える 3

2

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オーバーライドが含まれている可能性のある通常のファイルをソーシングしないことを明示します。
  • 最後に\、エイリアスが浮かんでいる場合に備えて、コマンドの前に'が追加されます

とは言うものの、このハックはすべて学術的な好奇心から行われたものであり、現実の世界に適用すべきではありません。

于 2013-03-05T04:34:26.067 に答える
0

unsetこの質問を書き留めている間、私はコマンドについて思い出しました。他の誰かが知りたい場合は、次のことができます。

unset builtin

unset cd

元のコマンドを期待どおりに機能させるため。メソッドの設定を解除せずにそうする方法があれば、その方法を知りたいと思います。

于 2013-03-04T18:36:43.473 に答える
0

もう1つのオプションはenv -i、エイリアスと関数を使用して環境を取り除くために使用することです。

builtin() { echo 'haha, got ya!'; }
builtin pwd
/usr/bin/env -i bash -c 'builtin pwd'
于 2014-11-20T13:33:00.757 に答える