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

pan*_*gas 7 bash shell-script

我有一个名为foo.sh的简单 bash 脚本,如下所示:

#!/bin/bash

echo "Foo!"
Run Code Online (Sandbox Code Playgroud)

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

我知道 the!是作为前一个命令显示的,如果在 pe 单引号内使用,则将其视为文字。我只是想知道用它运行脚本有什么区别echo "Foo!"(即使是source ./foo.sh工作,但直接从控制台它没有。

Chr*_*own 11

默认情况下,交互式 bash shell 启用了历史扩展(它控制 的行为!)。源文件(主要存在于历史扩展的概念之外)和脚本没有。来自man bash(或在线手册):

set [--abefhkmnptuvxBCEHPT] [-o option-name] [arg ...]
-H: 启用!样式历史替换。当 shell 是交互式的时,这个选项默认是打开的。

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

另见例如: