0

在查阅 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复合命令的第二行仍然没有出现在历史记录中?

4

1 回答 1

2

多行命令将是 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 选项,它应该适用于 if[] 的所有 4 行。所以猜测免责声明(在 bash man 中)会说不确定它是否始终与 cmdhist=off 一起工作。所以ignoreoption肯定不会在第二行“then”上工作。如果您在“then”之前放置一个空格,它将不会被忽略。它仅适用于第一行,但随后适用于所有下一行。

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

if [ -d /tmp ]
>  then
> echo Hello
> fi
Hello
history 5
   66  if [ -d /tmp ]
   67   then
   68  echo Hello
   69  fi
   70  history 5


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

于 2012-11-04T01:04:13.570 回答