Содержимое переменной сценария bash в строке cmd интерпретируется mplayer как имя файла - PullRequest
0 голосов
/ 03 декабря 2018

У меня есть скрипт для воспроизведения фильмов через mplayer, для которого я пытаюсь включить автоматическое преобразование 3D в 2D.Вот соответствующая строка cmd в том виде, в каком она появляется в скрипте

mplayer -fs "${g[$i]}" -ss $f "${d%.*}".* -hardframedrop -nocorrect-pts -identify &>> log.txt  

Это не отображается в 2D, даже если у "$ {g [$ i]}" есть необходимая опция

echo "${g[$i]}"
 -vo gl:stereo=3   

Но если я изменю строку cmd для непосредственного отображения опции, фильм будет показан в 2D

mplayer -fs -vo gl:stereo=3 -ss $f "${d%.*}".* -hardframedrop -nocorrect-pts -identify &>> log.txt  

Проблема, похоже, заключается в том, что mplayer интерпретирует эту опцию как имя файла при доставке через $ {g [$ i]}, то есть из log.txt

Playing  -vo gl:stereo=3 .
File not found: ' -vo gl:stereo=3 '
Failed to open  -vo gl:stereo=3 .  

Как я могу предотвратить это?

1 Ответ

0 голосов
/ 03 декабря 2018

Вы передаете " -vo gl:stereo=3 ", что действительно неверно.Вы должны пройти "-vo", а затем "gl:stereo=3".Другими словами, его следует передавать как два отдельных аргумента без начального и конечного пробелов.

Самый простой способ сделать это - пропустить кавычки вокруг ${g[$i]}:

mplayer -fs ${g[$i]} -ss $f "${d%.*}".* -hardframedrop -nocorrect-pts -identify &>> log.txt  

Более надежный обходной путь - хранить аргументы отдельно в массиве, например, opts=("-vo" "gl:stereo=3") и использовать "${opt[@]}", но Bash не поддерживает многомерные массивы, поэтому это может потребовать более глубоких изменений в вашем скрипте.

...