J'exécute un script sur une machine distante comme ceci:
ssh $host "pip install -r /path/to/requirements.txt"
Mais la sortie n'est pas en ligne tamponnée; au lieu de voir une ligne renvoyée à la fois, toutes les lignes (~ 10) sont toutes imprimées en même temps à la fin de la connexion.
Quoi de neuf avec ça? Est-il possible de les forcer à être tamponnés?
(aussi, pour énoncer l'évident: quand je ssh dans $host
et exécute la commande "manuellement", la sortie est mise en mémoire tampon, comme prévu)
-tt
- cela a fonctionné pour moi quand -t ne l'a pas fait.Pour approfondir un peu la réponse de Ryan Fox: De nombreux programmes (la plupart? C’est la valeur par défaut de tout programme C) line-buffer stdout lorsqu’ils parlent à un terminal, mais le tamponnent intégralement. (La norme C spécifie que stdout est initialement entièrement mis en mémoire tampon lorsqu'il est "possible de déterminer qu'il ne fait pas référence à un périphérique interactif".)
Donc, ce que vous voyez, c'est que la sortie du programme que vous exécutez à distance (comme donné à stdout) n'est pas en ligne tamponnée; SSH ne fait que passer à travers ce qu'il obtient quand il l'obtient. (Je pense que ssh n'effectue aucune mise en mémoire tampon sur sa sortie - ce serait le moyen le moins magique de s'assurer que l'utilisateur voit ce que le programme distant avait l'intention de faire.)
la source
Pour développer encore plus la réponse de Ryan Fox,
ssh -t
cela ne fonctionnait pas pour moi non plus, maisssh -tt
si. Voir la page de manuel ssh à propos de -t:la source