Voulez vérifier si une commande a réussi en redirigeant sa sortie dans une variable
Je suis en train d'écrire un script bash qui permet de charger des fichiers vidéo à YouTube à l'aide de GoogleCL.
Que je suis en train de faire ce téléchargement des trucs dans une boucle (car il peut y avoir plusieurs fichiers vidéo) je voudrais vérifier si chaque fichier a été téléchargé avec succès avant que j'ai télécharger la suivante.
La commande google youtube post --access unlisted --category Tech $f
(où $f représente le fichier) envoie une chaîne de caractères qui me dit que le téléchargement a été couronnée de succès ou non.
Mais je ne sais pas comment faire pour rediriger ce "retour" chaîne dans une variable afin de vérifier la réussite.
C'est ce que j'ai:
for f in ./*.ogv ./*.mov ./*.mp4
do
if [[ '*' != ${f:2:1} ]]
then
echo "Uploading video file $f"
# How to put the return value of the following command into a variable?
google youtube post --access unlisted --category Tech $f > /dev/null
# Now I assume that the output of the command above is available in the variable RETURNVALUE
if [[ $RETURNVALUE == *uploaded* ]]
then
echo "Upload successful."
else
echo "Upload failed."
fi
fi
done
Quelqu'un peut-il m'aider?
Vous devez vous connecter pour publier un commentaire.
Ma conjecture est que vous pourrait dépendre sur le code d'erreur de google de commande en tant que bien (je suis en supposant qu'elle renvoie une erreur si elle n'a pas de téléchargement, mais vous devriez probablement le double de vérifier cela).
Une idée fausse commune est que si veut entre crochets une expression à évaluer, ce n'est pas vrai, si prend toujours une commande et vérifie le statut de l'erreur; en général, cette commande est
[
qui est un alias pourtest
, qui évalue l'expression. (Et oui, je serais surpris s'il n'y a pas une optimisation de raccourci pour le faire aller plus vite à l'intérieur de bash, mais, conceptuellement, c'est toujours vrai).La capture de la sortie se fait via des backticks, comme
ou à l'aide de
$()
mais c'est probablement mieux d'utiliser le code d'erreur dans ce cas.
EDIT:
Vous avez une drôle de chose si dans votre fonction.. je n'avais pas remarqué au premier abord, mais il peut être évité si vous activez
nullglob
option shell (ce qui fera./*.mov
pour développer une chaîne de caractères vide, si il n'y a pas de fichiers). Aussi, la citation qui$f
ou il va se briser si vos noms de fichier contenant des espacesHTH.
$?
, je crois, pour l'erreur de code utilisé dans leif
que nous avons une assez grosse commande.google ..; result=$?; if [ $result -eq 0 ]; then ...
if google...
, suivie parthen
sur une ligne distincte. Je vais le modifier dans.=
. Ne pouvais pas comprendre pourquoi il n'arrêtait pas de dire ma variable est une commande non valide!Je dirais que c',
The command ... outputs a string
. 'Retour' est un mot-clé et la valeur de retour est un nombre, où 0 signifie par convention de succès (0 erreur) et une autre valeur indique un code d'erreur.Vous prenez la sortie par:
mais verrez souvent la mauvaise solution:
inférieure, parce que les backticks sont facilement confondus avec des apostrophes (selon la police) et difficile à nid, afin de ne pas les utiliser.
De " man bash:
et:
La valeur de retour/code de sortie de la dernière commande est acquis par le biais $?.
Le mot clé pour le sens que vous avez voulu dire est de la substitution de commande. Encore " man bash:
Si vous êtes encore en train de sortie après
> /dev/null
puis sortir sur la sortie stderr, de sorte que la norme backticks ou$()
ne fonctionne pas.D'abord, voir si le code de retour indique un problème: Examiner $? après le succès et l'échec.
Si il s'avère que le code de retour n'est pas suffisante, vous pouvez rediriger la sortie:
2>&1
met stderr sur la sortie standard (stdout) fd, avant de vous rediriger stdout pour rien.Utilisation
$()
Vous pouvez l'affecter à une variable à l'aide de backticks:
2>&1
pour rediriger stderr vers stdout.Exemple pour accéder à youtube
La réponse à la question est d'utiliser le
read
commande.Certain que tous ces autres réponses montrer des façons de ne pas faire ce que l'OP posé, mais qui a vraiment vis le reste d'entre nous, qui a cherché dans le cas des OP question.
Avertissement: C'est une double réponse
Ici est de savoir comment faire...
De commande:
Ici est ce qu'il fait et pourquoi il est important:
series | of | commands
, c'est très compliqué de la série de canalisations de commandes.mystic_command
est peut accepter stdin que le fichier, mais pas l'option arg par conséquent, il doit venir comme une variable**read
prend stdin et la place dans la variable$string
read
et lamystic_command
dans un "sous-shell" par parenthèse n'est pas nécessaire, mais le fait couler comme une conduite continue comme si les 2 commandes dans un script séparé de fichier.** Il y a toujours une alternative, et dans ce cas, l'alternative est moche et illisible: