【问题标题】:Message "syntax error near unexpected token `('"消息“意外标记 `(' 附近的语法错误”
【发布时间】:2011-07-30 10:18:01
【问题描述】:

我正在尝试执行

sudo -su db2inst1 /opt/ibm/db2/V9.7/bin/db2 force application (1995)

但我收到此错误:

bash:意外标记 `(' 附近的语法错误

然而,

sudo -su db2inst1 id

给我正确的输出。所以一定是关于()

如果我尝试

sudo -su db2inst1 /opt/ibm/db2/V9.7/bin/db2 force application \(1995\)

我明白了

/bin/bash: -c: line 0: 意外标记附近的语法错误(' \ /bin/bash: -c: line 0: /opt/ibm/db2/V9.7/bin/db2 force application (1995)'

以 db2inst1 用户身份运行 /opt/ibm/db2/V9.7/bin/db2 force application (1995) 给我同样的错误,但正在运行

/opt/ibm/db2/V9.7/bin/db2 "force application (1995)"

工作正常


正确的语法是

sudo -su db2inst1 '/opt/ibm/db2/V9.7/bin/db2 "force application (1995)"'

【问题讨论】:

    标签: bash shell


    【解决方案1】:

    注意:虽然这个答案在当时似乎是正确的 [sudo 在同年晚些时候被更改,以在 -i-i-s 的参数中添加额外的转义字符],但对于现代版本来说是不正确的sudo,在构造要传递给$SHELL -c 的命令行时转义所有特殊字符。始终小心并确保您知道将命令传递给特定版本的 sudo 会做什么,并仔细考虑您的命令是否真的需要 -s 选项和/或,如果需要,如果您会更好服务于sudo sh -c


    由于您已经拥有正在输入的 shell 和 sudo -s 运行的 shell,因此您需要引用或转义两次。以下三个中的任何一个都可以使用这个古老的 sudo 版本:

    sudo -su db2inst1 '/opt/ibm/db2/V9.7/bin/db2 "force application (1995)"'
    sudo -su db2inst1 '/opt/ibm/db2/V9.7/bin/db2 force\ application\ \(1995\)'
    sudo -su db2inst1 /opt/ibm/db2/V9.7/bin/db2 force\\ application\\ \\\(1995\\\)
    

    出于好奇,你为什么需要-s?您不能只执行以下操作吗?

    sudo -u db2inst1 /opt/ibm/db2/V9.7/bin/db2 'force application (1995)'
    sudo -u db2inst1 /opt/ibm/db2/V9.7/bin/db2 force\ application\ \(1995\)
    

    【讨论】:

    • 第一个建议不行,需要把单引号移到db2inst1后面。接下来的2个工作正常。谢谢。
    【解决方案2】:

    试试

    sudo -su db2inst1 /opt/ibm/db2/V9.7/bin/db2 force application \(1995\)
    

    【讨论】:

    • @Radek:不确定发生了什么,但这绝对是不是语法错误... :(
    • @Radek:是的,我看到了你的更新,但就像我说的,这绝对是 not 应该是语法错误;我不知道发生了什么。 :(
    • 你可能需要做\\(1995\\)。一种用于本地 shell,另一种用于远程 shell。或者甚至是三个括号?
    猜你喜欢
    • 2012-08-31
    • 2012-10-20
    • 2012-09-29
    • 2013-12-11
    • 1970-01-01
    • 1970-01-01
    • 2014-09-01
    • 2014-02-26
    相关资源
    最近更新 更多