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が開くことができないと文句を言います。両方「金持ち」そして「バー」。

これを説明するために、次のようにシェルコンテキストで問題を確認します。

$ 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

シェルは xclip の出力を再評価しないため、必要ありません。シェルはvlcを実行し、xclip -o出力を評価せずにパラメータを値に設定します。

直接テストするには、次のコマンドを実行できます。

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

答え2

変数置換とコマンド置換は常に二重引用符で囲んでください。これは代替結果のトークン化とワイルドカードを抑制します。これは働きます:

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

なぜ何もしないのを説明することはできません。おそらくLuaに私が気づかなかった微妙な部分があるかもしれません。回避策として、1行のスクリプトを作成できます。

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

Awesomeでスクリプトを呼び出します。

関連情報