如何在 bad.util.spawn_with_shell 命令中转义文本?

如何在 bad.util.spawn_with_shell 命令中转义文本?

基于一个建议,我现在接到以下电话rc.lua:

awful.util.spawn_with_shell('vlc $(xclip -o)')

如何确保 的输出xclip被转义以便空格字符不作为参数分隔符?例如,如果我选择字符串“foo bar”(不带引号)并按Mod4+ vVLC 会抱怨无法打开两个都“富”“酒吧”。

为了说明这一点,我将在 shell 上下文中验证该问题,如下所示:

$ params() {
    for param
    do
        echo "$param"
    done
}
$ params $(xclip -o)
params
$(xclip
-o)

并像这样修复它:

$ params "$(xclip -o)"
params "$(xclip -o)"

但是,如果我将 Lua 调用更改为此,它不会执行任何操作:

awful.util.spawn_with_shell('vlc "$(xclip -o)"')

答案1

不需要,因为 shell 不会再次评估 xclip 的输出; shell 将执行 vlc 并将参数设置为 的值,xclip -o而不评估输出。

要自己测试它,您可以运行以下命令:

echo $(echo '`ls`')
echo $(echo '$PATH')
echo $(echo '$(echo foobar)')

答案2

始终将变量替换和命令替换放在双引号中。这会抑制替换结果的分词和通配符。这应该有效:

awful.util.spawn_with_shell('vlc -- "$(xclip -o)"')

我无法解释为什么它什么都不做,可能 Lua 的一些微妙之处我没有注意到。作为一种解决方法,您可以编写一个单行脚本

#!/bin/sh
vlc -- "$(xclip -o)"

并从 Awesome 调用该脚本。

相关内容