¿Por qué no puedo obtener los valores de salida de un comando en este script bash?

9

Entonces estaba escribiendo este pequeño script nautilus para transcodificar video a 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

El problema es que, aunque el comando ffmpeg se ejecuta correctamente, el if [ "$?" -eq 0 ]

Parece que no se activa. ¿Porqué es eso? ¿Está &&mal o es algo más?

tesseract
fuente

Respuestas:

13

La única forma en que se puede alcanzar esa declaración es si la execmisma falla; Si tiene éxito, el ffmpegcomando reemplaza el shell por completo. (Pendientemente, &&también fallará en ese caso, por lo que no se puede alcanzar en absoluto). No lo desea exec, simplemente ejecútelo.

geekosaur
fuente
Ya veo, y sin el &&comando after ffmpeg, realmente funciona. Todavía tengo una pregunta más, si está bien en este lugar, ¿hay alguna manera de mostrar stdout y stderr de ffmpeg en algún lugar sin usar una ventana de terminal? Como en zenity fe
tesseract
Desea capturarlo con la $()construcción en una variable, luego pasar esa variable a zenity. Cuidado con los citando, y zenityen mi experiencia utiliza PanGo por lo que necesita para reemplazar <, &, >con &lt;, &amp;, &gt;respectivamente.
geekosaur
5

La exec commanddeclaración reemplaza el shell actual con command. Es decir, su secuencia de comandos termina realmente en la línea exec ffmpeg ...; las líneas restantes se ejecutarían si y solo si el ffmpegcomando no se encuentra en su RUTA (o no se puede iniciar por otras razones).

Puede obtener más detalles sobre el execbash integrado escribiendo help execen el símbolo del sistema 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.
    [...]
Riccardo Murri
fuente
1

De acuerdo con esto, exec reemplaza el shell con el comando que especifique. Por lo tanto, su secuencia de comandos nunca llega a los comandos más allá del exec.

No es necesario exec. Solo especifique el comando.

LawrenceC
fuente
0

Puede mantener el execcomando si lo coloca en una subshell:

- exec ffmpeg -i "$1" -ab 256k "$BASEFILENAME.mp3" &&
+ (exec ffmpeg -i "$1" -ab 256k "$BASEFILENAME.mp3") &&
jeff
fuente
Ya veo, pero ¿no está &&todavía mal allí?
tesseract
Si. ¿Y cuál es el punto de mantener el exec?
jmtd