Linux 是复合命令';第二行和后续行不受bash中HISTCONTROL的影响?

Linux 是复合命令';第二行和后续行不受bash中HISTCONTROL的影响?,linux,bash,Linux,Bash,在查阅bash的手册页时,它读到了关于bash历史的这句话: 多行复合命令的第二行和后续行是 未经测试,并且无论 HISTCONTROL 但我试过: $ HISTCONTROL=ignorespace $ if [ -f /var/log/messages ] > then > echo "/var/log/message exists." > fi $ history | tail -2 18 HISTCONTROL=ignorespace 19 histo

在查阅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
由空格引导。如果复合命令仍然没有出现在历史记录中,为什么该
的第二行仍然没有出现?

对于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
因此,如果在单行命令上放置空格,它将像历史设置一样被忽略

添加: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选项,则它应适用于If[]的所有4行。 因此,猜一猜免责声明(在bash-man中)会说,不确定它在cmdhist=off时是否始终有效。 所以ignoreoption在第二行“then”上肯定不起作用。如果在“then”前面加空格,则不会忽略它。它只在第一行起作用,然后在下一行起作用。

最后一个例子(不忽略第二行以空格开头)



我希望这能回答你的问题。

那么,这句话是什么意思?我不太确定。我想如果禁用cmdhist选项(shopts-u cmdhist),则可以确定忽略设置是否100%有效。默认情况下,此shell选项处于启用状态。请参见添加答案中的效果。只是一个猜测!!!
if [ -d /tmp ]
>  then
> echo Hello
> fi
Hello
history 5
   66  if [ -d /tmp ]
   67   then
   68  echo Hello
   69  fi
   70  history 5