bash -i behavior e “por que meu terminal está suspenso?”

2

Isso acontece em todas as distros que eu tentei:

$ cat | bash -i
bash-3.2$ ls
foo bar
bash-3.2$

E agora a sessão está suspensa. Ou seja, você recebe um comando one e então você praticamente precisa fechar a janela do terminal. SIGTERM (aka ^ C) é capturado pelo bash, mas não o levará de volta a um shell funcional.

Eu estou supondo que tem algo a ver com o -i causando bash para lutar com o gato pelo controle do tty, mas não consigo encontrar nada definitivo. Alguém pode explicar o que está acontecendo? E como automatizar a entrada para um programa que está executando execlp("/bin/bash", "bash", "-i") sem desligar? Eu tenho que escrever um programa parecido com o expect que lida com os caprichos?

    
por Fixee 26.03.2011 / 18:18

1 resposta

4

A resposta curta: sim, você vai ter que usar o Expect.

Quanto a por que está falhando: com base em seu comportamento, bash -i ativa readline (mesmo com --noediting ), que é bastante prejudicado com pipes. Ele também parece estar definindo modos de terminal (incluindo o modo sem bloqueio) via stdout em vez de stdin , o que significa que você perde o comportamento esperado da maioria dos caracteres de controle. (Não é, no entanto, ler o tty diretamente.)

Nota lateral: ^C envia SIGINT , não SIGTERM . Ambos estão, no entanto, presos no modo interativo ( -i ); SIGHUP trabalha para matá-lo.

    
por 26.03.2011 / 18:48

Tags