Por que não consigo obter os valores de saída de um comando neste script bash?

9

Então, eu estava escrevendo este pequeno script nautilus para transcodificar vídeo em 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

O problema é que, embora o comando ffmpeg seja executado com êxito, o if [ "$?" -eq 0 ]

parece não ser acionado. Por que é que? Está &&errado ou é outra coisa?

tesseract
fonte

Respostas:

13

A única maneira de alcançar essa afirmação é se a execprópria falha; se for bem-sucedido, o ffmpegcomando substitui o shell completamente. (Pedanticamente, a &&falha nesse caso também não pode ser alcançada.) Você não deseja exec, basta executá-lo.

geekosaur
fonte
Entendo, e sem o &&comando depois do ffmpeg ele realmente funciona. Ainda tenho mais uma pergunta, se estiver tudo bem neste local - existe uma maneira de exibir o stdout e o stderr do ffmpeg em algum lugar sem usar uma janela de terminal? Como em zenity fe
tesseract
Você deseja capturá-lo com a $()construção em uma variável e depois passar essa variável para zenity. Atente para citar, e zenityna minha experiência usa Pango então você precisa substituir <, &, >com &lt;, &amp;, &gt;respectivamente.
Geekosaur
5

A exec commandinstrução substitui o shell atual por command. Ou seja, seu script termina completamente na linha exec ffmpeg ...; as linhas restantes serão executadas se, e somente se, o ffmpegcomando não for encontrado no seu PATH (ou não puder ser iniciado por outros motivos).

Você pode obter mais detalhes sobre o execbash embutido digitando help execno prompt de comando do 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
fonte
1

De acordo com isso, exec o shell é substituído pelo comando que você especificar. Portanto, seu script nunca está recebendo os comandos além do exec.

Você não precisa exec. Basta especificar o comando.

LawrenceC
fonte
0

Você pode manter o execcomando se o colocar em um subshell:

- exec ffmpeg -i "$1" -ab 256k "$BASEFILENAME.mp3" &&
+ (exec ffmpeg -i "$1" -ab 256k "$BASEFILENAME.mp3") &&
jeff
fonte
Entendo, mas ainda não &&está errado lá?
usar o seguinte
Sim. E qual é o sentido de manter o exec?
jmtd