Pourquoi ne puis-je pas obtenir les valeurs de sortie d'une commande dans ce script bash?

9

J'écrivais donc ce petit script nautilus pour transcoder la vidéo en 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

Le problème est que, bien que la commande ffmpeg soit exécutée avec succès, if [ "$?" -eq 0 ]

ne semble pas se déclencher. Pourquoi donc? Est-ce &&mal ou est-ce autre chose?

tesseract
la source

Réponses:

13

Le seul moyen d'atteindre cette déclaration est que l' execéchec lui - même; si elle réussit, la ffmpegcommande remplace complètement le shell. (Pédantiquement, le &&échouera dans ce cas également donc il ne peut pas être atteint du tout.) Vous ne le voulez pas exec, exécutez-le simplement.

geekosaure
la source
Je vois, et sans la &&commande ffmpeg, cela fonctionne réellement. J'ai encore une autre question, si ça va à cet endroit - est-il possible d'afficher la stdout et la stderr de ffmpeg quelque part sans utiliser de fenêtre de terminal? Comme dans zenity fe
tesseract
Vous souhaitez le capturer avec la $()construction dans une variable, puis passer cette variable à zenity. Méfiez - vous citer, et zenitydans mon expérience utilise Pango de sorte que vous devez remplacer <, &, >avec &lt;, &amp;, &gt;respectivement.
geekosaur
5

L' exec commandinstruction remplace le shell actuel par command. Autrement dit, votre script se termine effectivement à la ligne exec ffmpeg ...; les lignes restantes seront exécutées si et seulement si la ffmpegcommande n'est pas trouvée sur votre PATH (ou si elle ne peut pas être lancée pour d'autres raisons).

Vous pouvez obtenir plus de détails sur le execbash intégré en tapant help execà l'invite de commande 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
la source
1

Selon cela, exec le shell est remplacé par la commande que vous spécifiez. Ainsi, votre script ne parvient jamais aux commandes après le exec.

Tu n'as pas besoin exec. Spécifiez simplement la commande.

LawrenceC
la source
0

Vous pouvez conserver la execcommande si vous la mettez dans un sous-shell:

- exec ffmpeg -i "$1" -ab 256k "$BASEFILENAME.mp3" &&
+ (exec ffmpeg -i "$1" -ab 256k "$BASEFILENAME.mp3") &&
Jeff
la source
Je vois, mais n'y a-t-il pas &&encore tort?
tesseract
Oui. Et quel est l'intérêt de garder le exec?
jmtd