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 transcodificação de 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 sucesso, o if [ "$?" -eq 0 ]

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

    
por tesseract 21.06.2011 / 22:27

4 respostas

13

A única maneira que a instrução pode ser alcançada é se o exec falhar; se tiver êxito, o comando ffmpeg substitui o shell completamente. (Pedantically, o && falhará nesse caso também, então não pode ser alcançado de jeito nenhum.) Você não quer exec , apenas rode.

    
por 21.06.2011 / 22:30
5

A instrução exec command substitui o shell atual por command . Ou seja, o seu script é terminado na linha exec ffmpeg ... ; as linhas restantes seriam executadas se e somente se o comando ffmpeg não é encontrado em seu PATH (ou não pode ser iniciado por outras razões).

Você pode obter mais detalhes sobre o exec bash incorporado digitando help exec no 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.
    [...]
    
por 21.06.2011 / 22:31
1

De acordo com isso exec substitui o shell pelo comando especificado. Portanto, seu script nunca está chegando aos comandos além do exec .

Você não precisa de exec . Apenas especifique o comando.

    
por 21.06.2011 / 22:32
0

Você pode manter o comando exec se você colocá-lo em um subshell:

- exec ffmpeg -i "$1" -ab 256k "$BASEFILENAME.mp3" &&
+ (exec ffmpeg -i "$1" -ab 256k "$BASEFILENAME.mp3") &&
    
por 22.06.2011 / 10:04

Tags