bash 命令参数中的感叹号

bash 命令参数中的感叹号

如果我在 Bash 中输入以下命令:

echo "dog!!"

我不明白字符串dog!!。相反,我得到了别的东西。

"dog!!"我尝试通过 echoing来回显字符串"dog\!\!,但它也不起作用。

当有两个感叹号时如何使用命令参数?

我希望这些感叹号被视为感叹号,没有任何特殊功能。

两个感叹号"!!"似乎是最后一个命令。

答案1

您需要转义感叹号,或者使用单身的引号:

echo dog\!\!
echo 'dog!!'

(这并不能解释为什么你的echo "dog\!\!"不起作用,但它应该起作用,我不知道为什么它不起作用。或者至少,它不应该作用于历史记录;在 Bash 中它将输出dog\!\!。)

答案2

在 Bash 中,如果您希望感叹号始终被视为常规字符并且不需要历史扩展,您可以在当前 shell 中禁用它:

set +o histexpand

或者将命令添加到常用的配置文件,即最有可能.bashrc对所有 shell 禁用它。

答案3

Linux 薄荷 18.1基于 Ubuntu 16.04:

bash --version | head -1
GNU bash, version 4.3.46(1)-release (x86_64-pc-linux-gnu)

行为如下:

echo dog\!\!

结果是:

dog!!
echo 'dog!!'

结果是:

dog!!
echo "dog!!"

意外地打印出接下来是最后一个命令;例如,如果您ls之前这样做过,它会打印:

echo "dogls"
dogls

GNU/Linux Debian 9 延伸有一个稍微新的版本:

bash --version | head -1
GNU bash, version 4.4.11(1)-release (x86_64-pc-linux-gnu)

行为如下:

echo dog\!\!

结果是:

dog!!
echo 'dog!!'

结果是:

dog!!
echo "dog!!"

意外地打印出接下来是最后一个命令;例如,如果您ls之前这样做过,它会打印:

echo "dogls"
dogls

这对我来说似乎是一致的。

在旧版本的旧系统上,它的行为可能bash略有不同。但在新系统上,我们可以预料到这种行为。

相关内容