【问题标题】:Missing matching quote with su -c in bash script在 bash 脚本中缺少与 su -c 匹配的引号
【发布时间】:2013-02-11 15:16:39
【问题描述】:

我想写一些类似的东西

EXEC="sudo su -m root -c \"java Something\""
$EXEC &

但我收到以下错误:

Something": -c: line 0: unexpected EOF while looking for matching `"'
Something": -c: line 1: syntax error: unexpected end of file

如果我在它执行的命令行上编写命令。如果我将它存储在一个变量中并试图推断它 - 它不会。为什么?

【问题讨论】:

  • 试试这个:for w in $EXEC ; do echo $w; done 你会看到的。
  • @Mat:不是同一个问题 - 问题是 \' 在 '...' 中没有意义,而 \" 在 "..." 中确实有意义。谢谢,但我知道如何使用搜索。
  • @n.m.我不明白你的意思。 for-in 只是在空格上拆分字符串,而不考虑引号。如果我在命令行上编写命令,它就会执行。编写该命令与将其存储在变量中并尝试推断它有什么区别?
  • 不同之处在于参数扩展的结果只在空格处进行分词(或IFS,见参考手册3.5.7)。通常的复杂标记化发生在从输入文件读取输入时。

标签: bash su


【解决方案1】:

试试这个:

exec="ls -l \"/a b c\""
$exec

你会看到类似的东西:

ls: cannot access "/a: No such file or directory
ls: cannot access b: No such file or directory
ls: cannot access c": No such file or directory

这准确地显示了问题出在哪里——也就是说——变量的扩展是在分词之后完成的。

要使其工作,您可以使用 eval:

=$ eval "$exec"
ls: cannot access /a b c: No such file or directory

甚至:

=$ sh -c "$exec"

或者更好的是,不要运行这样的命令。不确定它的目的是什么,但考虑避免在变量中构建完整的命令行。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-28
    • 2017-11-25
    • 2010-09-19
    相关资源
    最近更新 更多