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, patchpreguntará qué hacer con un parche invertido y svnsolicitará contraseñas, pero necesito ver qué sucede cuando se ejecutan de manera no interactiva.
Persuadir patchque no es interactivo es bastante fácil; Solo necesito redirigir stdoutpara ser un no-tty:
$ </dev/null > >(cat) /path/to/myscript --args
Sin embargo, svnse conectará al terminal de control si existe; editar los scripts para pasar --non-interactiveno 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/ttyno 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).

ttyconfirmar que no hay terminal en stdin, y el "?" en la columna depssalida TTY que confirma que no hay control tty para elshproceso (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/ttyes su tty controlador). Sin-wsetsid 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