Ele abre a manipulação incorreta de SIGPIPE
. head
e também dd
fecharão o pipe quando receberem seus 5 MB. Isso produz um erro EPIPE
na chamada do sistema write()
quando o processo openssl tenta gravar no canal:
EPIPE fd is connected to a pipe or socket whose reading end is closed. When this happens the writing process will also receive a SIGPIPE signal.
openssl então morreu devido a um sinal ao invés de sair normalmente. Você pode verificar isso em seu exemplo usando:
$ openssl enc -aes-256-ctr -pass pass:password -nosalt < /dev/zero | head -c 5M >file
error writing output file
$ echo ${PIPESTATUS[@]}
1 0
A matriz $PIPESTATUS
contém os valores de saída dos processos nos pipes. Você vê o processo openssl encerrado com o código de saída 1.
No entanto, para superar esse erro, use head
ou dd
antes do openssl no canal:
$ head -c 5M /dev/zero | openssl enc -aes-256-ctr -pass pass:password -nosalt >file
$ echo ${PIPESTATUS[@]}
0 0