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 调用该脚本。