Se eu usar:
strace echo 'a
b
c' > file
As linhas de fundo são:
write(1, "a\nb\nc\nd\n", 8) = 8
mas em
strace echo 'a
b
c
d' > /dev/pts/0
Essas linhas são:
write(1, "a\n", 2) = 2
write(1, "b\n", 2) = 2
write(1, "c\n", 2) = 2
write(1, "d\n", 2) = 2
No segundo caso, por que está escrevendo linha por linha, enquanto no primeiro caso está escrevendo junto. Pode ser porque o terminal é um dispositivo de caractere, mas recebi a definição de dispositivo de caractere como:
Um dispositivo de caractere (char) é aquele que pode ser acessado como um fluxo de bytes (como um arquivo). a maioria dos dispositivos char são apenas canais de dados, que você só pode acessar sequencialmente.
Edit: Shell é bash.
Isso é muito simples.
echo
O comando externo que você está executandostrace
é muito provavelmente o do GNU coreutils. Isso é escrito na linguagem de programação C e usa as funções da biblioteca de tempo de execução C, comoputchar()
efputs()
para gravar o que precisa gravar na saída padrão do programa.Na linguagem C, a saída para a saída padrão pode ser totalmente armazenada em buffer , em buffer de linha ou sem buffer . As regras para o que acontece são, na verdade, parte da especificação da linguagem C, aplicam-se a todos os sistemas operacionais e são escritas em termos abstratos sobre se a saída padrão "pode ser determinada para não se referir a um dispositivo interativo".
Nos sistemas operacionais Unix e Linux, a maneira concreta que eles se aplicam é que a saída padrão é totalmente armazenada em buffer se a
isatty()
função disser que o descritor de arquivo não é um terminal. Isso é o que é "um dispositivo interativo" neste caso. A saída padrão é armazenada em buffer de linha, em seu sistema operacional. O padrão da linguagem C não exige este último. É o que a biblioteca GNU C documenta adicionalmente , além do que o padrão da linguagem C diz.Portanto, quando
echo
a saída padrão do seu comando não é um terminal, mas um arquivo, a biblioteca C no programa armazena em buffer todas as gravações individuais na saída padrão e faz uma grandewrite()
chamada, quando o buffer está cheio ou quando o programa termina. Considerando que quando a saída padrão é um terminal, a biblioteca C apenas armazena em buffer as coisas até que um caractere de alimentação de linha seja gerado , ponto em quewrite()
é o conteúdo do buffer.Daí as chamadas de sistema observadas.
Leitura adicional