Perché non riesco a ottenere i valori di uscita di un comando in questo script bash?


9

Quindi stavo scrivendo questo piccolo script nautilus per la transcodifica di video 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

Il problema è, sebbene il comando ffmpeg sia eseguito correttamente if [ "$?" -eq 0 ]

sembra non innescarsi. Perché? È &&sbagliato o è qualcos'altro?

Risposte:


13

L'unico modo in cui tale affermazione può essere raggiunta è se la execstessa non riesce; se riesce, il ffmpegcomando sostituisce completamente la shell. (Pedanticamente, anche &&in questo caso fallirà, quindi non può essere raggiunto affatto.) Non vuoi execfarlo, basta eseguirlo.


Vedo, e senza il &&comando after ffmpeg funziona davvero. Ho ancora un'altra domanda, se va bene in questo posto - c'è un modo per visualizzare lo stdout e lo stderr di ffmpeg da qualche parte senza usare una finestra terminale? Come in zenity fe
tesseract,

Dovresti catturarlo con il $()costrutto in una variabile, quindi passare quella variabile a zenity. Attenzione per citando, e zenitynella mia esperienza usa PanGo quindi è necessario sostituire <, &, >con &lt;, &amp;, &gt;rispettivamente.
geekosaur,

5

L' exec commandistruzione sostituisce la shell corrente con command. Cioè, la tua sceneggiatura termina definitivamente alla riga exec ffmpeg ...; le linee rimanenti verrebbero eseguite se e solo se il ffmpegcomando non viene trovato sul PERCORSO (o non può essere avviato per altri motivi).

Puoi ottenere maggiori dettagli sull'integrato execbash digitando help execal prompt dei comandi 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

In base a ciò exec sostituisce la shell con il comando specificato. Quindi il tuo script non arriva mai ai comandi oltre il exec.

Non hai bisogno exec. Basta specificare il comando.


0

È possibile mantenere il execcomando se lo si inserisce in una subshell:

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

Capisco, ma non è &&ancora sbagliato lì?
tesseract,

Sì. E qual è il punto di mantenere il exec?
jmtd il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.