!在字符串中使其在命令行中不可用 - 错误消息"event not found"



这是一个很简单的问题,我找不到答案。

我有一个字符串,如"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!'

最新更新