【问题标题】:Escape quotes inside su -csu -c 中的转义引号
【发布时间】:2016-11-24 16:11:29
【问题描述】:

我想将可能包含空格的路径传递给 su -c 脚本内的 su -c 命令:

su -c "xdg-desktop-menu install ${DesktopFile}" -m "${Username}"

$DesktopFile 是我需要转义的路径。我在"" 中使用' 尝试了许多变体,使用\" 和几个大括号,但我还没有想出解决方案。有趣的是, xdg-desktop-icon 工作正常,但 xdg-desktop-menu 在空白处消失。有什么建议吗?

【问题讨论】:

    标签: linux shell escaping quote su


    【解决方案1】:

    如果你使用的是 bash,printf '%q' 可用于在引用不足时转义特殊字符。

    su -c "xdg-desktop-menu install $(printf '%q' "$DesktopFile") -m $(printf '%q' "$Username")"
    

    注意$(printf...) 不需要引号,但"$DesktopFile" 需要。该变量需要安全地传递给printf,因此必须引用它。 printf '%q' 的输出保证不受分词和通配的影响,因此不需要引号。 (不过,如果你想引用它,你可以。它的两边都需要\"。)

    【讨论】:

    • 谢谢。 2 个问题:a) 我想使用 sh 而不是 bash,所以没有 %q 可用,b) -m 是 su 的选项,而不是 xdg-desktop-menu,所以引号会有所变化。 b) 我可以解决,但是 a) 是个问题……对 printf %q on sh 有什么建议吗?
    • 好的,切换到 /bin/bash 进行测试,发现:FFQ=$(printf '%q' "$DesktopFile") su -c "xdg-desktop-menu install $FFQ" -m "$Username" 在空白之后仍然分裂。
    • 找到了 xdg-desktop-menu 和空格的(n 旧)错误报告,即使通过正确转义也是如此。也许我的版本仍然有这个错误。
    【解决方案2】:

    我无法确定这是否是 xdg-desktop-menu 中的错误,因为它在 xdg-desktop-icon 中有效,但我现在正在使用一种解决方法:

    cd "$PathWithSpaces"
    su -c "xdg-desktop-menu install $DesktopFilenameWithoutSpaces" -m "$Username"
    

    PathWithSpaces 包含DesktopFilenameWithoutSpaces,似乎工作可靠。

    【讨论】:

      猜你喜欢
      • 2012-04-24
      • 1970-01-01
      • 2016-01-16
      • 1970-01-01
      • 1970-01-01
      • 2019-11-02
      • 1970-01-01
      • 1970-01-01
      • 2011-01-01
      相关资源
      最近更新 更多