我有一个简单的 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
禁用它。
另请参见例如: