Capture de la sortie SSH en tant que variable dans le script bash
J'ai été aux prises avec ce problème lors de l'écriture d'un script bash.
Fondamentalement, je veux mesurer le temps d'un programme sur un serveur distant, donc j'utilise la commande:
/usr/bin/time -f %e sh -c "my command > /dev/null 2>&1"
pour exécuter le programme.
Cependant, il semble que je ne peut pas capturer la sortie de ma commande (SSH) à une variable. En fait, le résultat (le temps) ne cesse de s'imprimer sur la sortie standard stdout.
Le code complet est:
respond=$(ssh ${fromNode} /usr/bin/time "-f" "%e" "'sh' '-c' 'virsh migrate --live ${VM} qemu+ssh://${toNode}/system --verbose > /dev/null 2>&1'")
La valeur de répondre est tout simplement vide, mais le temps est imprimé sur la sortie standard.
source d'informationauteur Andy Dang
Vous devez vous connecter pour publier un commentaire.
"temps" commande permet d'afficher le résultat sur la sortie stderr, pas de sortie standard (stdout). Ainsi, il n'est pas acheminée dans votre variable.
Vous devez rediriger stderr vers stdout pour atteindre ce que vous voulez:
Et votre code peut ressembler à quelque chose comme ceci:
Essayez de la permutation de l'ordre des redirections (pour
2>&1 >/dev/null
). Votre code actuel est l'envoi de deux stdout et stderr vers /dev/null (donc je suis un peu curieux de savoir pourquoi rien est imprimé à tout).Pourquoi est-ce nécessaire? La syntaxe
2>&1
signifie " dupliquer la sortie standard (descripteur 1) stderr (descripteur 2)"; en effet, stderr est en fait une copie de la sortie standard (stdout). Si vous mettez>/dev/null
d'abord, puis stdout est tout d'abord redirigé vers /dev/null, puis stderr est souligné dans le courant de la sortie standard, c'est à dire /dev/null.Mais si vous mettez
>/dev/null
deuxième, stderr va d'abord devenir un exemplaire de la sortie standard (la normal flux de sortie), avant la sortie standard est redirigée. Donc la commande est stderr imprime à l'ats (ou l'interprète) comme si elle venait de sortie standard (stdout), tandis que stdout est réduit au silence. C'est le comportement que vous voulez.De
man bash
: