Estoy investigando el comportamiento de un script que normalmente se ejecuta como un proceso automatizado (por ejemplo, cron, Jenkins). El script puede (eventualmente) invocar comandos que se comportan de manera diferente (buscando la entrada del usuario) cuando se ejecuta de forma interactiva; por ejemplo, patch
preguntará qué hacer con un parche invertido y svn
solicitará contraseñas, pero necesito ver qué sucede cuando se ejecutan de manera no interactiva.
Persuadir patch
que no es interactivo es bastante fácil; Solo necesito redirigir stdout
para ser un no-tty:
$ </dev/null > >(cat) /path/to/myscript --args
Sin embargo, svn
se conectará al terminal de control si existe; editar los scripts para pasar --non-interactive
no es realmente una opción, ya que proviene de varios niveles y sería difícil estar seguro de que encontré cada invocación.
¿Hay alguna manera de invocar un script / comando de forma no interactiva, sin un terminal de control (para que eso /dev/tty
no exista)? Prefiero que stdout / stderr aún vaya a mi terminal.
(Encontré la pregunta ¿ Ejecutar script en un shell no interactivo? Pero las respuestas a eso discuten las diferencias entre el entorno cron y el entorno del usuario; ya he eliminado todas las diferencias excepto la no interactividad).
tty
confirmar que no hay terminal en stdin, y el "?" en la columna deps
salida TTY que confirma que no hay control tty para elsh
proceso (y cualquier cosa que se ejecute debajo de él).setsid -w
. Ejemplo:setsid -w sh -c 'tty < /dev/tty'
dash: 1: cannot open /dev/tty: No such device or address
(Nota:/dev/tty
es su tty controlador). Sin-w
setsid se ejecuta el proceso en paralelo / en segundo plano.Probablemente quieras hacer un script de esperar. Ejemplo con SVN:
/programming/609445/using-expect-to-login-into-svn
fuente
A veces es necesario mantener abierto el stdin (no recibir eof en el stdin) (por ejemplo, esperar). En ese caso, cambie / dev / null a / dev / zero.
fuente