2015-05-06 5 views
1

Следующая головоломка: я написал сценарий bash с простой задачей извлечения mp3-файлов без файлов mp4. Идея этого первого проекта состоит в том, чтобы просто использоватьBash скрипт сгенерировал команду, действующую на консоли, но не в скрипте

avconv -i input.mp4 output.mp3 

который отлично работает на консоли.

#!/bin/bash 
# "extract_mp3_from_mp4.sh test.mp4 test.mp3" 

if [ $# == 0 ]; then 
     echo -e "Extracts mp3 from mp4 video.\nUsage: $0 src_mp4 [target_mp3=src_mp4.mp3];" 
     exit 0; 
fi; 

file_in=$1; 
file_out=$2; 
if [ -z $file_out ]; then file_out="${file_in}.mp3"; fi; 

echo "Attempting to extract '${file_in}' to '${file_out}'"; 

cmd="avconv -i ${file_in} ${file_out};"; 
echo "Casting command: ${cmd}"; 

exit `$cmd`; 

Рассмотрим на вызов

./extract_mp3_from_mp4.sh test.mp4 test.mp3 

создания команды

avconv -i test.mp4 test.mp3; 

Что озадачивает меня это: Команда, созданная скрипте абсолютно справедливы. Если я скопирую его из вывода, генерируемого , эхо «Команда каста: ...» прямо в консоль команда работает должным образом. Однако при использовании в сценарии ($cmd выходе) avconv возвращает

Unable to find a suitable output format for 'test.mp3; 

Как это может быть?

+0

Вы пробовали удаления точки с запятой из строчки, которую вы создаете? –

ответ

2

Проблема заключается в точке с запятой:

cmd="avconv -i ${file_in} ${file_out};"; 

должен быть

cmd="avconv -i ${file_in} ${file_out}"; 

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

+0

Ooookay ... попробовав это, я мгновенно вижу мудрость ваших слов, когда моя проблема решена. Большое спасибо! :-) Невозможно ли тогда использовать несколько команд в одном '..'? Во всяком случае ... внимательно прочитав сообщение об ошибке avconv, снова появляется _does_, что программа добавила ';' к имени выходного файла и был overtasked найти кодек для ".mp3;" вывод. –

+0

В сценариях разрывы строк работают достаточно хорошо. В однострочном пространстве убедитесь, что у вас есть пробел ** перед ** и ** после ** ';' –

+0

. ';' Добавление к последнему аргументу в точности является проблемой - оставление пустого будет чаще всего помогать –

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

  • Нет связанных вопросов^_^