Quero gerar uma lista classificada com todos os números de 8 dígitos - de 00000000 a 99999999. Digitei no shell:
f() {
while IFS="" read -r line; do
for i in {0..9}; do
echo "$line$i";
done;
done
}
echo | f | f | f | f | f | f | f | f | tee result.txt | wc -l
resposta é
bash: echo: write error: Interrupted system call
bash: echo: write error: Interrupted system call
bash: echo: write error: Interrupted system call
99998890
Por que recebi esses três erros e result.txt incorreto?
eu uso
Lançamento do GNU bash, versão 4.4.12 (1) (x86_64-pc-linux-gnu)
Debian GNU / Linux 9.6 (estiramento)
Kernel do Linux: 4.19.0 # 2 SMP Qui 1 nov 15:31:34 EET 2018 x86_64 GNU / Linux
seq -w 0 99999999
.}
) funciona corretamente. @ GAD3Rkonsole
janela. Esse redimensionamento é quase suficiente no meu caso, mas não é necessário.| tee result.txt
e ainda assim receber o erro./bin/echo
no meu caso), em vez deecho
interno, torna a função imune (ou pelo menos menos propensa) a esse problema.Respostas:
O
write error: Interrupted system call
erro específico é gerado quando o tamanho da janela do console é alterado enquanto o script está sendo executado.Fazendo um:
irá evitá-lo.
Observe que um
Será mais rápido e evitará o
SIGWINCH
problema.fonte
Este é realmente um bug [1] em
bash
, e isso não acontece apenas emSIGWINCH
, mas também em qualquer sinal de que uma armadilha foi definida:Isso ocorre porque
bash
falha em a) definir seus manipuladores de sinal comSA_RESTART
(exceto oSIGCHLD
manipulador) ou b) manipular oEINTR
quando chamandowrite()
nosprintf
eecho
internos.EINTR
("Chamada interrompida do sistema") não é uma maneira de indicar uma condição de erro, mas um hack que permite ao programador combinar o bloqueio de leituras / gravações / etc com a manipulação de sinais no loop principal. Nunca deve vazar para o usuário.Esse bug não aparece com muita frequência porque é uma tarefa fácil obter as condições corretas:
write()
deve ser feito por um builtin (não por um comando externo), deve preencher o buffer do pipe (o leitor no outro end deve ser muito mais lento ou não ler do pipe, mas ainda estar vivo ), e o script deve usar traps ou a janela do terminal deve ser redimensionada.E por causa de diversos artefatos de implementação, isso afeta apenas
write()
s interrompidos , nãoread()
s ouopen()
s (como por exemplo, o bloqueioopen()
de um pipe nomeado / fifo).[1] uma forma disso já foi relatada há algum tempo.
fonte