根据Bash手册,环境变量BASH_COMMAND
包含
当前正在执行或将要执行的命令,除非外壳程序由于陷阱而正在执行命令,在这种情况下,它是在陷阱发生时执行的命令。
撇开陷阱的情况,如果我理解正确,这意味着当我执行命令时,变量BASH_COMMAND
包含该命令。这不是绝对清楚地表明变量是否是在执行命令后复位(也就是,只有avaialble 而命令正在运行,但不是之后),尽管有人可能会认为,既然是“命令当前正在执行或即将执行的” ,不是刚刚执行的命令。
但是让我们检查一下:
$ 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
(变量只被扩展了一次),因此我进行了查找grep
,一次在一个$BASH_COMMAND
不存在的文件中,两次在该文件中tmp
。
问题1:我目前的假设是否正确:
BASH_COMMAND
仅在命令尝试对其求值时设置;和- 即使描述可能使我们相信,在执行命令后仍未设置它?
问题2:如果是,为什么?性能?如果否,那么如何解释上述命令序列中的行为?
问题3:最后,在任何情况下都可以实际使用此变量吗?我实际上是在尝试使用它$PROMPT_COMMAND
来分析正在执行的命令(并根据需要执行一些操作),但是我不能,因为在我的内部$PROMPT_COMMAND
,我立即执行了一个命令来查看变量$BASH_COMMAND
,即变量获取该命令的设置。即使我MYVARIABLE=$BASH_COMMAND
刚开始在时$PROMPT_COMMAND
,也会MYVARIABLE
包含字符串MYVARIABLE=$BASH_COMMAND
,因为赋值也是命令。(这个问题不关乎如何在$PROMPT_COMMAND
执行中获取当前命令。我知道还有其他方法。)
这有点像海森堡的不确定性原理。只需观察变量,即可对其进行更改。
bash
über- gurus。