$()
расширяется должным образом, но оболочка делает больше для результата, чем вы знаете. Кроме того, добавление буквенных кавычек к путевым именам почти никогда не бывает правильным (, если только вы не используете eval
где-то ).
Воспроизведение всех файлов MP3 в диапазоне ~/Documents/music
или ниже с помощьюvlc
:
find ~/Documents/music -type f -name '*.mp3' -exec vlc {} +
Это запустит vlc
как можно больше файлов MP3 одновременно.
Чтобы пропустить использование find
всех -вместе:
shopt -s globstar
vlc ~/Documents/music/**/*.mp3
Это будет работать до тех пор, пока у вас не будет большого количества файлов MP3 (, и в этом случае вы получите сообщение об ошибке, поскольку список аргументов станет слишком длинным ).
Универсальный объект **
"рекурсивно" соответствует файловой иерархии, но должен быть включен с помощью shopt -s globstar
вbash
(оболочке zsh
этот глобус включен по умолчанию ).
Ваша команда
vlc $(echo $(find ~/Documents/music -name "*.mp3" -exec echo "\"{}\" \n " \;) | head -n 1)
сначала выполнит find
,head
и echo
. Этот конвейер будет выводить
"/home/XXX/Documents/music/My Folder/1 - track/the name of track.mp3"
Затем оболочка разбивает эту строку на слова "/home/XXX/Documents/music/My
, Folder/1
, -
, track/the
, name
, of
и track.mp3"
по пробелам в строке.
Затем
vlc
будет вызываться с этими отдельными аргументами. В частности, аргумент -
может быть ошибочно принят за параметр, в то время как другие, скорее всего, будут восприниматься как отдельные операнды имени пути.
Это подробно объясняется в