咨询Bash的男人页面时,它读取有关bash历史的句子:
多行复合命令的第二个和后续行是 未经过测试,并将其添加到历史中,无论其价值如何
HISTCONTROL
。
,但我尝试过:
$ HISTCONTROL=ignorespace
$ if [ -f /var/log/messages ]
> then
> echo "/var/log/message exists."
> fi
$ history | tail -2
18 HISTCONTROL=ignorespace
19 history | tail -2
请注意,if
由一个空间导致。为什么此if
复合命令的第二行仍未出现在历史记录中?
多行命令将是shell的一行:
$ if [ -f /var/log/messages ]
> then
> echo "/var/log/message exists."
> fi
与:
一样if [ -f /var/log/messages ]; then echo "/var/log/message exists."; fi
因此,如果将空格放在一行命令上,它将像历史记录设置一样被忽略。
add:shell选项cmdhist的效果
shopt -s cmdhist # set cmdhist (is set by default)
if [ -d /tmp ]
> then
> echo Hello
> fi
Hello
history 2
43 if [ -d /tmp ]; then echo Hello; fi
44 history 2
在这种情况下,多行命令与单行连接。
shopt -u cmdhist # unset cmdhist
if [ -d /tmp ]
> then
> echo Hello
> fi
Hello
history 5
46 if [ -d /tmp ]
47 then
48 echo Hello
49 fi
50 history 5
在这种情况下,您会分别看到历史中的每一行。
如果您现在设置了ignorespace选项,则应在[]的所有4行上使用。因此,猜猜免责声明(在Bash Man中)会说不确定它与CMDHIST = OFF一起工作。因此,忽略肯定不会在第二行上"然后"不起作用。如果您在"然后"之前放置一个空间,则不会忽略它。它仅在第一行工作,但随后全部工作。
所以最后一个示例(不忽略第二行从空间开始)
if [ -d /tmp ]
> then
> echo Hello
> fi
Hello
history 5
66 if [ -d /tmp ]
67 then
68 echo Hello
69 fi
70 history 5
我希望这会回答您的问题。