如何包含“!”在传递给从 Bash 命令行调用的脚本的字符串参数中

如何包含“!”在传递给从 Bash 命令行调用的脚本的字符串参数中

我需要测试当用户错误输入两个标点符号时 python TTS 程序如何反应。

所以我需要检查“C'est un test!”这句话。 (注意!.在最后)。

因此我在提示时输入

  $ python3 /home/user1/TTS/bin/synthesize.py --text "C'est un test!."

但 Bash 随后显示​​:

python3 /home/user1/TTS/bin/synthesize.py --text "这是一个测试./configure"

(注意“!.”如何更改为“./configure”)。

“这是一个测试!” (没有句点)有效,但我需要测试“!.”。

我尝试用单引号替换双引号但没有成功,我尝试并转义了“!”与“”,但它包含在发送到 TTS 库的句子中。

我明白 ”!”在 Bash 中有特殊含义(很好解释这里) 并与“.”相关联。它使用以前的命令。

有没有办法阻止 Bash 处理“!.”在字符串中并按原样传递它?

感谢您的帮助

答案1

这就是历史扩展。您可以通过使用set +Horset +o histexpand或 设置$histchars为空字符串来完全禁用它,或者在这里您可以使用单引号而不是双引号。在引号之外,还可以通过添加前缀!来禁用历史扩展\

根据set --helpbash:

-o option-name
设置与 option-name 对应的变量:
[...]
histexpand 与 -H
[...]
-H
启用!风格历史替代。当 shell 处于交互状态时,该标志默认处于打开状态。
[...]
使用 + 而不是 - 会导致这些标志被关闭。

您可以尝试运行以下命令来检查差异:

set -H
$> echo "hello!."
$> echo "hello!1"
$> !2
$> !3

set +H
$> echo "hello!."
$> echo "hello!1"
$> !2
$> !3

相关内容