【问题标题】:how to ignore bash event designator when it appears in command line? [duplicate]当它出现在命令行中时如何忽略bash事件指示符? [复制]
【发布时间】:2013-12-13 12:49:06
【问题描述】:

echo "!omg" 输出-bash: !omg: event not found

  1. 如何将!omg 字符串输出到控制台?
  2. 我的问题出现是因为我需要使用命令行执行一些节点代码:

    node -e "var code = function(){ console.log('which contains a lot of !'); }; !func();"

【问题讨论】:

    标签: bash


    【解决方案1】:

    使用单引号:

    echo '!omg'
    

    如果您的输入中有引号,例如打印console.log('lalala'),说:

    echo $'console.log(\'lalala\')'
    

    或者说:

    cat | command << EOF
    my_string_with_crazy_characters
    EOF
    

    最后一种形式不需要您转义输入中的任何字符。

    【讨论】:

    • 它可以工作,但它也会删除字符串中的任何',因此echo 'console.log('lalala')' 打印console.log(lalala) 而不是console.log('lalala') - 有什么解决方法吗?我必须传递 javascript 代码,所以源代码中可能会出现很多不同的字符......而且我无法从文件中加载脚本。
    • @user606521 见上面的编辑。
    • 你也可以选择 printf 而不是 echo(它更便携!):printf '%s\n' "$something" 将打印 $something 变量的内容。
    • @OlivierDulac 这是鸡和蛋的问题。问题本质上是关于获取引号和疯狂字符。在这种情况下,cat 解决方案将是理想的,因为它不需要转义输入。
    【解决方案2】:

    您可以按如下方式关闭history expansion

    [username@hostname ~]$ set +o histexpand
    [username@hostname ~]$ echo hello!world!anything
    hello!world!anything
    

    开启

    [username@hostname ~]$ set -o histexpand
    [username@hostname ~]$ echo hello!world!anything
    -bash: !world!anything: event not found
    

    【讨论】:

      【解决方案3】:

      我更喜欢取消设置 shell 变量 histchars 以有效禁用历史扩展:

      $ echo !omg
      bash: !omg: event not found
      $ histchars=
      $ echo !omg
      !omg
      

      【讨论】:

        猜你喜欢
        • 2019-12-12
        • 2010-10-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-12-17
        • 1970-01-01
        • 1970-01-01
        • 2019-11-13
        相关资源
        最近更新 更多