Warum kann ich die Exit-Werte eines Befehls in diesem Bash-Skript nicht abrufen?

9

Also schrieb ich dieses kleine Nautilus-Skript zum Umcodieren von Videos in 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

Das Problem ist, obwohl der Befehl ffmpeg erfolgreich ausgeführt wird if [ "$?" -eq 0 ]

scheint nicht ausgelöst zu werden. Warum ist das so? Ist das &&falsch oder ist es etwas anderes?

Tesseract
quelle

Antworten:

13

Diese Aussage kann nur erreicht werden, wenn die execselbst fehlschlägt. Wenn dies erfolgreich ist, ersetzt der ffmpegBefehl die Shell vollständig. (Pedantisch schlägt das &&auch in diesem Fall fehl, sodass es überhaupt nicht erreicht werden kann.) Sie möchten execes nicht, sondern führen es einfach aus.

Geekosaurier
quelle
Ich verstehe, und ohne den &&Befehl nach dem ffmpeg funktioniert es tatsächlich. Ich habe noch eine Frage, ob es an dieser Stelle in Ordnung ist - gibt es eine Möglichkeit, stdout und stderr von ffmpeg irgendwo anzuzeigen, ohne ein Terminalfenster zu verwenden? Wie in Zenity Fe
Tesseract
Sie möchten es mit dem $()Konstrukt in eine Variable erfassen und diese Variable dann an übergeben zenity. Achten Sie auf zitiert, und zenityin meiner Erfahrung nutzt PanGo so Sie ersetzen müssen <, &, >mit &lt;, &amp;, &gt;jeweils.
Geekosaurier
5

Die exec commandAnweisung ersetzt die aktuelle Shell durch command. Das heißt, Ihr Skript endet tatsächlich in der Zeile exec ffmpeg .... Die verbleibenden Zeilen werden nur dann ausgeführt, wenn der ffmpegBefehl in Ihrem PATH nicht gefunden wird (oder aus anderen Gründen nicht gestartet werden kann).

Weitere Informationen zum integrierten execBash erhalten Sie, indem Sie help execan der Bash-Eingabeaufforderung Folgendes eingeben :

$ 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.
    [...]
Riccardo Murri
quelle
1

Demnach exec ersetzt die Shell den von Ihnen angegebenen Befehl. Ihr Skript gelangt also nie zu den Befehlen nach dem exec.

Du brauchst nicht exec. Geben Sie einfach den Befehl an.

LawrenceC
quelle
0

Sie können den execBefehl behalten, wenn Sie ihn in eine Subshell einfügen:

- exec ffmpeg -i "$1" -ab 256k "$BASEFILENAME.mp3" &&
+ (exec ffmpeg -i "$1" -ab 256k "$BASEFILENAME.mp3") &&
Jeff
quelle
Ich verstehe, aber ist das dort &&immer noch nicht falsch?
Tesseract
Ja. Und was bringt es, das zu behalten exec?
jmtd