gpt4 book ai didi

linux - 复合命令的第二行和后续行是否不受 bash 中的 HISTCONTROL 影响?

转载 作者:太空宇宙 更新时间:2023-11-04 09:48:59 24 4
gpt4 key购买 nike

在查阅 bash 的手册页时,它读到关于 bash 历史的这句话:

The second and subsequent lines of a multi-line compound command are not tested, and are added to the history regardless of the value of 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

因此,如果您在单行命令上放置空格,它将像历史设置一样被忽略。

添加: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


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

关于linux - 复合命令的第二行和后续行是否不受 bash 中的 HISTCONTROL 影响?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13215003/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com