Почему я не могу получить выходные значения команды в этом скрипте 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этого, просто запустите его.

geekosaur
источник
Я вижу, и без команды &&после ffmpeg это на самом деле работает. У меня все еще есть еще один вопрос, если это нормально в этом месте - есть ли способ где-то отобразить stdout и stderr ffmpeg без использования окна терминала? Как в zenity Fe
Тессеракт
Вы хотели бы захватить его с помощью $()конструкции в переменную, а затем передать эту переменную 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. Просто укажите команду.

LawrenceC
источник
0

Вы можете сохранить execкоманду, если поместите ее в подоболочку:

- exec ffmpeg -i "$1" -ab 256k "$BASEFILENAME.mp3" &&
+ (exec ffmpeg -i "$1" -ab 256k "$BASEFILENAME.mp3") &&
Джефф
источник
Понятно, но разве там &&все не так?
Тессеракт
Да. И какой смысл хранить exec?
JMDD