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?

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.


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

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.


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

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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.