Estou investigando o comportamento de um script que normalmente é executado como um processo automatizado (por exemplo, cron, Jenkins). O script pode (eventualmente) chamar comandos que se comportam de maneira diferente (buscando a entrada do usuário) quando executados de maneira interativa; por exemplo, patch
perguntará o que fazer com um patch invertido e svn
solicitará senhas, mas preciso ver o que acontece quando elas são executadas de maneira não interativa.
Convencer patch
que não é interativo é bastante fácil; Eu só preciso redirecionar stdout
para ser um não-tty:
$ </dev/null > >(cat) /path/to/myscript --args
No entanto, svn
será conectado ao terminal de controle, se existir; editar os scripts para passar --non-interactive
não é realmente uma opção, pois isso vem de vários níveis e seria difícil ter certeza de que encontrei todas as chamadas.
Existe uma maneira de chamar um script / comando de maneira não interativa, sem um terminal de controle (para que /dev/tty
isso não exista)? Eu preferiria que o stdout / stderr ainda vá para o meu terminal.
(Encontrei a pergunta Executar script em um shell não interativo? Mas as respostas discutem as diferenças entre o cron e o ambiente do usuário; já eliminei todas as diferenças, exceto a não interatividade.)
tty
confirmar que não há terminal no stdin, e o "?" na coluna TTY deps
saída que confirma que não há controle tty para osh
processo (e qualquer coisa em execução sob ele).setsid -w
. Exemplo:setsid -w sh -c 'tty < /dev/tty'
givessh: 1: cannot open /dev/tty: No such device or address
(Nota:/dev/tty
é o seu controle tty). Sem-w
setsid executa o processo em paralelo / em segundo plano.Você provavelmente desejará criar um script esperado. Exemplo com SVN:
/programming/609445/using-expect-to-login-into-svn
fonte
Às vezes, você precisa manter o stdin aberto (não receber eof no stdin) (por exemplo, esperar). Nesse caso, altere / dev / null para / dev / zero.
fonte