这是一个非常简单的问题,我无法找到答案。
我有一个字符串,例如“ASDGFasd#!dasd”,我想将其作为参数输入命令行。
python test.py "ASDGFasd#!dasd"
这不会运行带有提供的字符串的test.py(正如我想要的那样),而是返回:
bash: !dasd: event not found
如何解决这个问题?
我正在使用ubuntu 14.04 LTS和python 2.7
答案 0 :(得分:6)
我将尝试总结类似问题的现有答案:
!
由 bash
扩展,作为 历史记录扩展功能的一部分,默认情况下 交互式 shell中的 ,脚本默认 off > (非交互式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(!)
- 这是问题的要点" How to escape history expansion exclamation mark ! inside a double quoted " command substitution like "$(echo '!b')"?" !
解析本身甚至不尊重双引号,并且在!
历史扩展参数之后考虑任何非空白字符的运行,包括{{1 }};例如,"
- 尽管双引号不平衡 - 被视为有效命令,echo foo!"
也是如此。<强>从未强>:
echo foo!bar"baz