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?

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.


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.
    [...]

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.


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") &&

Entendo, mas ainda não &&está errado lá?
usar o seguinte

Sim. E qual é o sentido de manter o exec?
jmtd
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.