bash 脚本中的感叹号与终端中的感叹号

bash 脚本中的感叹号与终端中的感叹号

我有一个简单的 bash 脚本,名为foo.sh像这样:

#!/bin/bash

echo "Foo!"

./foo.sh当我收到消息时运行它Foo!,一切都很好。但如果我echo "Foo!"直接从控制台,那么我会获得预期的行为和消息:bash: !": event not found

据我所知, the!是作为先前的命令呈现的,如果在 pe 单引号内使用,则它被视为文字。我只是想知道用它运行脚本有什么区别echo "Foo!"(即使可以source ./foo.sh工作,但直接从控制台运行却不行。

答案1

默认情况下,交互式 bash shell 启用历史扩展(这控制 的行为!)。源文件(很大程度上存在于历史扩展的概念之外)和脚本则不然。来自man bash(或在线手册):

set [--abefhkmnptuvxBCEHPT] [-o option-name] [arg ...]
-H:启用!样式历史替换。当 shell 处于交互式状态时,此选项默认处于启用状态。

set [+-]H可以使用, 或,手动调整此行为set [+-]o histexpand,其中-H/-o 使历史扩展,和+H/+o 禁用它。

另请参见例如:

相关内容