!在字符串中使它在命令行中不可用 - 错误消息“找不到事件”

时间:2015-11-13 03:01:45

标签: bash shell

这是一个非常简单的问题,我无法找到答案。

我有一个字符串,例如“ASDGFasd#!dasd”,我想将其作为参数输入命令行。

python test.py "ASDGFasd#!dasd"

这不会运行带有提供的字符串的test.py(正如我想要的那样),而是返回:

bash: !dasd: event not found

如何解决这个问题?

我正在使用ubuntu 14.04 LTS和python 2.7

1 个答案:

答案 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