这是一个很简单的问题,我找不到答案。
我有一个字符串,如"ASDGFasd#!dasd",我想将其作为参数输入到命令行中,例如
python test.py "ASDGFasd#!dasd"
这并没有在提供字符串的情况下运行test.py(正如我所希望的那样),而是返回:
bash: !dasd: event not found
如何解决此问题?
我正在使用ubuntu 14.04 LTS和python 2.7
我将尝试总结类似问题的现有答案:
-
!
由bash
作为历史扩展功能的一部分进行扩展,该功能在交互式shell中默认为打开,但在脚本(非交互式shell)中默认为关闭。- 具体而言,
!
与以下字符一起被解释为调用上一个命令的表达式;例如,!!
调用最近执行的命令,而!l
调用以l
开始的最近执行的指令
- 具体而言,
-
完全避免扩展
!
的一个简单方法是关闭历史扩展,这是可取的,因为该功能可能具有破坏性,并且readline
库的功能(稍后介绍)是一个很好的替代品。- 要关闭历史扩展,请将
set +H
(或set +o histexpand
)添加到您的~/.bashrc
文件(或OS X上的~/.bash_profile
文件)中-建议在"-bash:!":event not found"的最高投票答案中这样做 - 另一种选择(尽管可能不太明智)是通过将特殊的
histchars
shell变量设置为所需的字符,选择替代字符进行历史扩展
- 要关闭历史扩展,请将
打开历史扩展时,!
被扩展:
-
始终:
- 在未加引号的字符串中:
echo hi!
- 在双引号字符串中,与嵌入的命令替换无关:
echo "hi!"
- 请注意,这意味着
!
甚至在双引号字符串中嵌入的命令替换中扩展到单引号字符串内:显然,在解析双引号字符串的内部以识别嵌入的命令替代之前,历史扩展发生在解析的早期;例如:echo "$(echo 'hi!')" # '!' is still expanded(!)
-这是问题的要点"如何在双引号的"命令替换"(如"$(echo';!b';)"内逃脱历史扩展感叹号?" - 严格来说,
!
解析本身甚至不尊重双引号,并将!
之后的任何非空白字符列视为历史扩展参数,包括"
;例如,echo foo!"
——尽管双引号不平衡——被视为有效命令,echo foo!bar"baz
也是如此
- 请注意,这意味着
- 在未加引号的字符串中:
-
从不:
- 在单引号字符串中:
echo 'hi!'
- 在单引号字符串中: