Para onde o erro seria enviado ao executar file_2
?
Quando você digita ./file_2
(com o arquivo executável), o sistema executa /bin/sh ./file_2
- isto é, está executando uma nova cópia de /bin/sh
, que é responsável por executar os comandos em ./file2
e por relatando os erros que encontra lá, enviando-os para stderr.
Mas você acabou de executar esse /bin/sh
com o stderr fechado. Por isso, quer que emita um erro, mas não tem para onde fazê-lo.
Qual você pode verificar com:
$ strace -e write,dup2 -fo /dev/stdout sh -c 'echo foo >&2' 2>&-
8785 dup2(2, 1) = -1 EBADF (Bad file descriptor)
8785 write(2, "sh: 1: ", 7) = -1 EBADF (Bad file descriptor)
8785 write(2, "2: Bad file descriptor", 22) = -1 EBADF (Bad file descriptor)
O dup2
falha porque o fd 2 está fechado, sh
tenta reportar o erro no stderr, mas isso falha assim como o stderr (fd 2) está fechado.