Список имен файлов в качестве аргумента для mplayer => mplayer не распознает имена файлов

Я хочу случайно воспроизвести некоторые музыкальные файлы с mplayer . Я не хочу переключать плеер на это, я хочу понять, что здесь не так.

 ThePandaTooth $ ls file_1.ogg file_2.ogg file_3.ogg 

Я знаю, вывод ls | sort -R ls | sort -R приводит к рандомизированному выводу имен файлов. Но я не могу играть с ними, по странной причине, он не может найти файл. Сортировка здесь не имеет значения.

 ThePandaTooth $ mplayer $(ls | sort -R) Playing file_1.ogg. Cannot open file 'file_1.ogg': No such file or directory Failed to open file_1.ogg Playing file_2.ogg. Cannot open file 'file_2.ogg': No such file or directory Failed to open file_2.ogg 

EDIT : Mplaying файлов с mplayer * работает, конечно.

Очень вероятно, что проблема в том, что вы определили псевдоним в одном из *rc файлов:

 alias ls='ls --color=always' 

В таком случае цветовые коды выживают в линиях трубопровода, а mplayer получает имена файлов, окруженные этими кодами. Вы можете передать вывод команды подстановки $() в printf чтобы узнать, что действительно получает mplayer , например

 printf '%q\n' $(ls | sort -R) 

Вы увидите что-то вроде

 $'\E[01;35mFile_1.ogg\E[0m' $'\E[01;35mFile_2.ogg\E[0m' $'\E[01;35mFile_3.ogg\E[0m' 

Очевидно, что mplayer правильно сообщает «Нет такого файла или каталога» и печатает полные проблемные имена файлов, включая escape-коды, но оболочка еще раз интерпретирует эти коды как цвет, поэтому вы видите только имена на выходе, что может сбивать с толку.

Чтобы правильно передать имена файлов, просто запустите \ls или command ls или даже запустите новую оболочку с bash -f , так что bash не будет использовать псевдоним, но встроенную команду

 $ printf '%q\n' $(\ls | sort -R) File_1.ogg File_2.ogg File_3.ogg 

Я действительно не думаю, что вы должны вовлекать ls или sort здесь. Если вы хотите воспроизвести файлы в произвольном порядке, просто используйте опцию -shuffle :

 mplayer -shuffle *