Bashマニュアルによると、環境変数にBASH_COMMAND
は
シェルがトラップの結果としてコマンドを実行していない限り、現在実行されている、または実行されようとしているコマンド。
そのトラップコーナーケースを別として、私が正しく理解していれば、これはコマンドを実行したときに変数BASH_COMMAND
にそのコマンドが含まれていることを意味します。絶対にその変数は、コマンドの実行後に設定されていないかどうかはっきりしていない(つまり、唯一のavaialbleである一方、 1はそれがあるので、「コマンドがあると主張かもしれませんが、コマンドはなく、後に、実行されている)、現在実行中またはされようとして実行します」 、それはコマンドでないだけでた実行します。
しかし、チェックしましょう:
$ set | grep BASH_COMMAND=
$
空の。期待していたBASH_COMMAND='set | grep BASH_COMMAND='
かもしれませんがBASH_COMMAND='set'
、たぶん、ただ空に驚いただけです。
他のことを試してみましょう:
$ echo $BASH_COMMAND
echo $BASH_COMMAND
$
それは理にかなっています。コマンドを実行するecho $BASH_COMMAND
と、変数BASH_COMMAND
に文字列が含まれますecho $BASH_COMMAND
。今回はなぜ機能しましたが、以前は機能しませんでしたか?
set
もう一度やろう。
$ set | grep BASH_COMMAND=
BASH_COMMAND='echo $BASH_COMMAND'
$
待って それはされた私は、実行時に設定するecho
コマンドを、そして、それはありませんでした、その後解除。しかし、私がset
再び実行したとき、コマンドに設定されてBASH_COMMAND
いませんでしたset
。set
ここでコマンドを実行する頻度に関係なく、結果は変わりません。では、実行時に変数が設定されますが、実行時には設定されecho
ませんset
か?どれどれ。
$ echo Hello AskUbuntu
Hello AskUbuntu
$ set | grep BASH_COMMAND=
BASH_COMMAND='echo $BASH_COMMAND'
$
何?変数だから私は、実行時に設定されていたecho $BASH_COMMAND
が、ではない私は、実行時にecho Hello AskUbuntu
?今の違いはどこですか?変数は、現在のコマンド自体が実際にシェルに変数を評価させるときにのみ設定されますか?別の何かを試してみましょう。おそらく、変更のためのbashビルトインではなく、今度は外部コマンドがいくつかあります。
$ /bin/echo $BASH_COMMAND
/bin/echo $BASH_COMMAND
$ set | grep BASH_COMMAND=
BASH_COMMAND='/bin/echo $BASH_COMMAND'
$
うーん、また...変数が設定されました。私の現在の推測は正しいですか?変数は、評価が必要な場合にのみ設定されますか?どうして?どうして?パフォーマンス上の理由で?もう一度試してみましょう。$BASH_COMMAND
ファイルでgrepを試行し$BASH_COMMAND
、grep
コマンドを含める必要があるgrep
ため、そのgrep
コマンド(つまり、それ自体)に対してgrepを実行する必要があります。それでは、適切なファイルを作成しましょう。
$ echo -e "1 foo\n2 grep\n3 bar\n4 grep \$BASH_COMMAND tmp" > tmp
$ grep $BASH_COMMAND tmp
grep: $BASH_COMMAND: No such file or directory
tmp:2 grep <-- here, the word "grep" is RED
tmp:4 grep $BASH_COMMAND tmp <-- here, the word "grep" is RED
tmp:2 grep <-- here, the word "grep" is RED
tmp:4 grep $BASH_COMMAND tmp <-- here, the word "grep" is RED
$ set | grep BASH_COMMAND=
BASH_COMMAND='grep --color=auto $BASH_COMMAND tmp'
$
面白いですね。コマンドはgrep $BASH_COMMAND tmp
に拡大してしまったgrep grep $BASH_COMMAND tmp tmp
、と私はのためにgrepped(変数はもちろん、一度だけのことを拡大します)grep
ファイルに一度、$BASH_COMMAND
存在し、二回ファイルではありませんtmp
。
Q1:私の現在の仮定は正しいことですか:
BASH_COMMAND
コマンドが実際に評価しようとしたときにのみ設定されます。そして- それはない記述はそう信じるように私たちを導くことにもかかわらず、コマンドの実行後に解除?
Q2:はいの場合、なぜですか?パフォーマンス?いいえの場合、上記のコマンドシーケンスの動作は他にどのように説明できますか?
Q3:最後に、この変数を実際に有意義に使用できるシナリオはありますか?私は実際$PROMPT_COMMAND
に実行中のコマンドを分析するためにそれを使用しようとしていました(そしてそれに応じていくつかのことを行います)が、できません、なぜなら$PROMPT_COMMAND
、私の中で、変数$BASH_COMMAND
、変数そのコマンドのセットを取得します。私は場合でもMYVARIABLE=$BASH_COMMAND
、私の初めに右$PROMPT_COMMAND
、そしてMYVARIABLE
文字列が含まれているMYVARIABLE=$BASH_COMMAND
割り当てがあまりにコマンドですので、。(この質問は、$PROMPT_COMMAND
実行中に現在のコマンドを取得する方法に関するものではありません。他の方法もあります。)
ハイゼンベルクの不確実性原理と少し似ています。変数を観察するだけで、変更します。
bash
über- gurusがあります。