$()が正しく拡張されないのはなぜですか?

$()が正しく拡張されないのはなぜですか?

vlcを使用してディレクトリ内のすべての.mp3ファイルを再生したいので、次のようにします。

vlc $(find ~/Documents/music -name "*.mp3" -exec "echo \"{}\"" \;)

問題は、「vlc:不明なオプションまたは必須パラメータ '-D'がありません」というメッセージが表示されることです。それはおそらく構文解析の問題でしょう。

それではファイルごとにしてみましょう:

echo $(echo $(find ~/Documents/music -name "*.mp3" -exec echo "\"{}\" \n " \;) | head -n 1)

私は得る:

"/home/XXX/Documents/music/My Folder/1 - track/the name of track.mp3"

私が実行したとき:

vlc "/home/XXX/Documents/music/My Folder/1 - track/the name of track.mp3"

効果がある

しかし、私が走るとき

vlc $(echo $(find ~/Documents/music -name "*.mp3" -exec echo "\"{}\" \n " \;) | head -n 1)

私は得る:

cannot open file /home/XXX/the (No such file or directory)

vlcの引数が正しく引用されていない場合、これは意味があります。しかし、そうですか?それでは、なぜ引用符で囲まれていない文字列としてvlcに渡されますか?

ベストアンサー1

拡張出力では見積もりは処理されません。$(echo '"foo bar"')orを実行すると、$(echo "\"foo bar\"")デフォルトのコマンドの引数は"fooandですbar"。リテラル引用符と2つの異なる引数を使用します。噴射

デフォルトでは、単語の区切りはすべてのスペース、スペース、または改行文字で発生するため、出力はどのスペースがファイル名の一部か、どのスペースがそれを区切るために使用された印刷内容の一部であるかを知るfindことはできません。find一般的な場合でも、ファイル名に改行文字を含めることができるため、区別できません。

あなたができることは次のとおりです。

find ... -print0 | xargs -0 vlc 

または

find ... -exec vlc {} +

最初は、findNULバイトで区切られたファイル名を出力し、xargs予想される内容を知らせます。ただし、すべてのシステムにfind -print0およびがあるわけではありませんxargs -0

2番目の関数find自体が起動し、尾vlc{} +複数のファイル名をvlc

大量のファイルを探していて、1つのコマンドラインに入ることができない場合は、両方のファイルをvlc複数回起動できます。

望むより:

デバッグにこれを使用すると、引数echoが空白で連結され、echo foo barとを区別できなくなるので実際には動作しませんecho "foo bar"

おすすめ記事