2011-01-21 2 views
1

Это мой сценарий оболочки, но она дает ошибку:Как я могу запустить эту команду в скрипте

#!/bin/sh 

while getopts "i:o:" flag 
do 
    case $flag in 
    i) file_input=$OPTARG 
    ;; 
    o) file_output=$OPTARG 
    ;; 
    esac 
done 

mplayer -nosound -benchmark -vo yuv4mpeg:file=>(x264 --demuxer y4m \ 
       --crf 20 --threads auto --output $file_output -) $file_input 

сообщения об ошибке:

Невозможно получить памяти или дескриптор файла write "> (x264 --demuxer y4m --crf 20 --threads auto --output video.264 -)"! FATAL: невозможно инициализировать видеодрайвер.

Когда я запускаю этот ЦМД на замазку:

mplayer -nosound -benchmark -vo yuv4mpeg:file=>(x264 --demuxer y4m \ 
       --crf 20 --threads auto --output video.264 -) video.wmv 

он прекрасно работает ..

Что я делаю неправильно?

+0

Все решения не являются функциональными .. – Sascha

ответ

4

Используемая вами команда использует сложный синтаксис pipe stream to subshell bash, то есть >() для достижения того, что вы хотите. Вероятно, ваш /bin/sh (который вы вызываете в качестве оболочки для этого скрипта в shebang) не совпадает с оболочкой, которую вы используете в интерактивном режиме (например, bash)?

+0

/bin/sh, вероятно, является ссылкой на/bin/bash, но под именем/bin/sh доступны не все функции bash - и '' => ' «нотация в частности не поддерживается. –

+0

Никогда не знал о '>()' раньше, спасибо! – sarnold

+0

@Jonathan: нет обозначения '=>'. '=' Является частью команды mplayer. '> (...)' - это то, что анализирует Bash. – thkala

0

Я предлагаю вам добавить некоторые ', чтобы защитить вас специальные символы:

mplayer -nosound -benchmark -vo 'yuv4mpeg:file=>(x264 --demuxer y4m --crf 20 --threads auto --output $file_output -)' $file_input 
1

>(...) процесс оператора замена Bash-специфичны. Он также недоступен, если Bash называется /bin/sh, потому что в этом случае Bash ограничивает себя более совместимым подмножеством своих функций.

Просто используйте #!/bin/bash вместо #!/bin/sh в начале вашего скрипта.

Смежные вопросы