Ich untersuche das Verhalten eines Skripts, das normalerweise als automatisierter Prozess ausgeführt wird (z. B. cron, Jenkins). Das Skript kann (eventuell) Befehle aufrufen, die sich bei interaktiver Ausführung anders verhalten (nach Benutzereingaben suchen). Ich patch
werde zum Beispiel fragen, was mit einem umgekehrten Patch zu tun ist, und svn
nach Passwörtern fragen, aber ich muss sehen, was passiert, wenn sie nicht interaktiv ausgeführt werden.
Es patch
ist ziemlich einfach, davon zu überzeugen, dass es nicht interaktiv ist. Ich muss nur umleiten stdout
, um ein Nicht-Tty zu sein:
$ </dev/null > >(cat) /path/to/myscript --args
Stellt svn
jedoch eine Verbindung zum steuernden Terminal her, falls vorhanden. Das Bearbeiten der zu übergebenden Skripte --non-interactive
ist keine Option, da dies aus mehreren Ebenen stammt und es schwierig sein könnte, sicher zu sein, dass ich jeden Aufruf gefunden habe.
Gibt es eine Möglichkeit, ein Skript / einen Befehl nicht interaktiv ohne ein steuerndes Terminal aufzurufen (das /dev/tty
gibt es also nicht)? Ich würde es vorziehen, wenn stdout / stderr immer noch zu meinem Terminal geht.
(Ich habe die Frage Skript ausführen in einer nicht interaktiven Shell gefunden? In den Antworten darauf werden jedoch die Unterschiede zwischen der Cron- und der Benutzerumgebung erörtert. Ich habe bereits alle Unterschiede außer der Nicht-Interaktivität beseitigt.)
tty
Bestätigung ist, dass es kein Terminal auf stdin gibt, und das "?" In der TTY-ps
Ausgabespalte, die bestätigt, dass für den Prozess (und alles, was darunter läuft) kein tty gesteuert wirdsh
.setsid -w
. Beispiel:setsid -w sh -c 'tty < /dev/tty'
gibtsh: 1: cannot open /dev/tty: No such device or address
(Hinweis:/dev/tty
ist Ihre steuernde tty). Ohne-w
setsid läuft der Prozess parallel / im Hintergrund.Sie werden wahrscheinlich ein Expect-Skript erstellen wollen. Beispiel mit SVN:
/programming/609445/using-expect-to-login-into-svn
quelle
Manchmal müssen Sie stdin offen halten (nicht eof auf stdin erhalten) (z. B. erwarten). In diesem Fall ändern Sie / dev / null in / dev / zero.
quelle