Reunindo as informações sobre o shell que foi usado ( eshell
), parece que o aspecto de fluxo desse shell é o culpado. Normalmente, piping significa abrir duas extremidades de um pipe + fork / exec, de modo que você obtenha dois processos que compartilham um descritor de arquivo em um pipe, e a comunicação passa diretamente pelo kernel. Dessa forma, nada pode ser perdido - é garantido que é seguro (embora, se o pipe ou qualquer fluxo envolvido estiver em buffer, talvez seja necessário aguardar que o primeiro processo saia normalmente para liberar o último fragmento do fluxo). / p>
A julgar pelo trecho do manual do eshell :
Eshell is not a replacement for system shells such as bash or zsh. Use Eshell when you want to move text between Emacs and external processes; if you only want to pipe output from one external process to another (and then another, and so on), use a system shell, because Emacs’s IO system is buffer oriented, not stream oriented, and is very inefficient at such tasks. If you want to write shell scripts in Eshell, don’t; either write an elisp library or use a system shell.
eshell não está fazendo isso da maneira normal, mas falsifica o pipe usando seus "buffers" (representação de arquivos abertos do emacs) como depósito intermediário de dados, e (sem mais pesquisas) eu acho que em algum momento, wc
executa read
e emacs
responde com um trecho vazio (e retornar 0 de read
é um sinal de que o fluxo terminou), em vez de esperar mais entradas do primeiro programa para preencher o buffer. Se for esse o caso, significa que o eshell não é apenas ineficiente, mas cheio de bugs quando se trata de tubos.