Talvez isso tenha sido respondido anteriormente, eu gostaria de receber um link para outra resposta ...
Se eu executar um comando do shell (em um bash
shell) como o seguinte:
make
Então, enquanto a saída de make
está rolando a partir STDOUT
do make
comando, se eu digitar make check
e pressionar enterantes que o primeiro comando seja executado, quando o make
comando finalmente terminar, o próximo comando make check
será retomado e executado.
Minhas perguntas são simplesmente:
- Isso é perigoso de se fazer?
- Existem comportamentos potenciais inesperados desse tipo de digitação rápida?
- Por que isso funciona da maneira que funciona?
Respostas:
Funciona da mesma maneira porque o Unix é full-duplex. Como Ritchie disse em O sistema de compartilhamento de tempo UNIX: uma retrospectiva :
[citação final]
Dito isto, existem alguns programas modernos que consomem ou descartam qualquer tipo de digitação;
ssh
eapt-get
são dois exemplos. Se você digitar com antecedência enquanto estiverem em execução, poderá descobrir que a primeira parte da sua entrada desapareceu. Isso poderia ser um problema.fonte
bash
fork()
esexec
o comando, o primeiro comando ainda está anexado ao doSTDIN
shell bash? Parece que a resposta é não, o bash parece estar armazenando buffer para o próximo comando. Isso está correto?&
.STDIN
tratado de uma maneira quino? E suponho que, a menos que o processo filho do bash feche explicitamente seu identificador de arquivo herdadoSTDIN
, ele ainda poderá ler a partir de digitação adicional?O comportamento básico que você está vendo é que a entrada fica em um buffer em algum lugar até que seja lida (bem, se você digitar o suficiente, eventualmente os buffers serão preenchidos e algo será perdido, porém , seria muita digitação). A maioria das coisas executadas pelo make não lê do STDIN, portanto permanece no buffer.
O perigo é que o comando errado leia sua entrada. Por exemplo,
make
chama algo que decide solicitá-lo e, em seguida, pode ler o seu próximo comando como resposta. Quão perigoso isso depende do comando, é claro. (Eles também podem liberar todas as entradas primeiro, apenas descartando a entrada anterior.)Um comando, comumente usado em Makefiles, que pode fazer isso é o TeX. Se encontrar um erro (e não receber um sinalizador para nunca solicitar ao usuário), ele perguntará como você deseja continuar.
A melhor opção é provavelmente a prazo:
make && make check
.fonte
make
no seu exemplo) ter sido concluído com êxito. Por exemplo,make foo
Enter>./foo
Enter pode causar um problema. Você pode tentar adquirir o hábito de digitar coisas comomake && make check
, onde o segundo comando será executado apenas se o primeiro for bem-sucedido.make check
tivesse os seis primeiros caracteres de , você acabaria executando o comandoheck
, o que provavelmente não existe no seu sistema (mas pode ser algo desagradável). Se o primeiro comando é algo benigno em que você conhece e confia, não vejo imediatamente nenhum problema.fonte
ls
emount
por exemplo. Estou tentando entender como a entrada em buffer é tratada. Obrigado pela resposta.