逃避su -c内的引用

时间:2016-11-24 16:11:30

标签: linux shell escaping quote su

我想将一个可能包含空格的路径传递到su -c脚本中的.sh命令中:

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

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

2 个答案:

答案 0 :(得分:0)

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

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

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

答案 1 :(得分:0)

我无法弄清楚这是否是xdg-desktop-menu中的错误,因为它适用于xdg-desktop-icon,但是我现在正在使用一种解决方法:

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

PathWithSpaces包含DesktopFilenameWithoutSpaces,似乎可靠地运作。