Чому я не можу отримати значення виходу команди в цьому скрипті bash?


9

Тому я писав цей маленький сценарій наутилуса для перекодування відео в mp3:

#! /bin/bash -x

if [ -z "$1" ]
    then
    zenity --warning --text="Error - No file selected !"
    exit 1
fi

BASEFILENAME=${1%.*}

exec ffmpeg -i "$1" -ab 256k "$BASEFILENAME.mp3" &&

if [ "$?" -eq 0 ]
    then
    zenity --info --text="Converting successful"
    exit
fi

Проблема полягає в тому, що команда ffmpeg успішно виконується if [ "$?" -eq 0 ]

схоже, не спрацьовує. Чому так? Це &&неправильно чи це щось інше?

Відповіді:


13

Єдиний спосіб, до якого можна дійти твердження, - це якщо execвоно не вдається; якщо це вдається, ffmpegкоманда повністю замінює оболонку. (Педантично, і &&в цьому випадку ця помилка не вийде, тому її взагалі не можна досягти.) Ви цього не хочете exec, просто запустіть її.


Я бачу, і без &&після команди ffmpeg вона насправді працює. У мене є ще одне питання, якщо це нормально в цьому місці - чи є спосіб відобразити stdout і stderr ffmpeg десь без використання вікна терміналу? Як у феєрії zenity
tesseract

Ви хочете зафіксувати його з $()конструкцією в змінну, а потім передати цю змінну в zenity. Слідкуйте за цитування, і zenityв моєму досвіді використовує PanGo так що вам потрібно замінити <, &, >з &lt;, &amp;, &gt;відповідно.
geekosaur

5

Оператор exec commandзамінює поточну оболонку на command. Тобто, ваш сценарій закінчується в черзі exec ffmpeg ...; залишилися рядки будуть виконуватися, якщо і лише тоді, коли ffmpegкоманда не знайдена у вашому PATH (або вона не може бути запущена з інших причин).

Ви можете отримати більш детальну інформацію про execвбудований bash, ввівши help execкомандну команду bash:

$ help exec
exec: exec [-cl] [-a name] [command [arguments ...]] [redirection ...]
    Replace the shell with the given command.

    Execute COMMAND, replacing this shell with the specified program.
    ARGUMENTS become the arguments to COMMAND.  If COMMAND is not specified,
    any redirections take effect in the current shell.
    [...]

1

Відповідно до цього exec замінює оболонку вказаною вами командою. Тож ваш сценарій ніколи не потрапляє до команд, що минають exec.

Вам не потрібно exec. Просто вкажіть команду.


0

Ви можете зберегти execкоманду, якщо ви помістите її в підзарядку:

- exec ffmpeg -i "$1" -ab 256k "$BASEFILENAME.mp3" &&
+ (exec ffmpeg -i "$1" -ab 256k "$BASEFILENAME.mp3") &&

Я бачу, але чи &&все ще не так?
tesseract

Так. І який сенс зберігати exec?
jmtd
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.