J'étudie le comportement d'un script qui est normalement exécuté comme un processus automatisé (par exemple cron, Jenkins). Le script peut (éventuellement) invoquer des commandes qui se comportent différemment (en recherchant la saisie de l'utilisateur) lorsqu'il est exécuté de manière interactive; par exemple, patch
demandera quoi faire avec un patch inversé et svn
demandera des mots de passe, mais j'ai besoin de voir ce qui se passe lorsqu'ils sont exécutés de manière non interactive.
Convaincre patch
qu'il n'est pas interactif est assez facile; J'ai juste besoin de rediriger stdout
pour être un non-tty:
$ </dev/null > >(cat) /path/to/myscript --args
Cependant, svn
se connectera au terminal de contrôle s'il existe; éditer les scripts à passer --non-interactive
n'est pas vraiment une option car cela vient de plusieurs niveaux et il serait difficile d'être certain d'avoir trouvé chaque invocation.
Existe-t-il un moyen d'invoquer un script / commande de manière non interactive, sans terminal de contrôle (donc cela /dev/tty
n'existe pas)? Je préfère que stdout / stderr continue d'aller à mon terminal.
(J'ai trouvé la question Exécuter le script dans un shell non interactif? Mais les réponses à cela discutent des différences entre l'environnement cron et l'environnement utilisateur; j'ai déjà éliminé toutes les différences sauf la non-interactivité.)
tty
confirmation qu'il n'y a pas de terminal sur stdin, et le "?" dans la colonne deps
sortie TTY qui confirme qu'il n'y a pas de contrôle tty pour lesh
processus (et tout ce qui s'exécute en dessous).setsid -w
. Exemple:setsid -w sh -c 'tty < /dev/tty'
donnesh: 1: cannot open /dev/tty: No such device or address
(Remarque:/dev/tty
est votre tty de contrôle). Sans-w
setsid exécute le processus en parallèle / en arrière-plan.Vous voudrez probablement faire un script attendu. Exemple avec SVN:
/programming/609445/using-expect-to-login-into-svn
la source
Parfois, vous devez garder stdin ouvert (ne pas recevoir eof sur stdin) (par exemple, attendre). Dans ce cas, remplacez / dev / null par / dev / zero.
la source