Por que é possível referir-se a um stderr fechado sob bash?

4

Eu gostaria de saber porque o bash não exibe uma mensagem de erro quando nos referimos a um stderr fechado. Quando se trata de outros descritores de arquivos, eles precisam ser abertos se quisermos, por exemplo, duplicá-los. Stderr parece ser especial nesse caso:

$ cat file_1
echo Test1 1>&5
$ cat file_2
echo Test2 1>&2

$ ./file_1 5>&-
./file_1: line 1: 5: Bad file descriptor
$ ./file_1 5>&1
Test1
$ ./file_2 2>&-
$ #NO ERROR and no output!
$ ./file_2
Test2

Por que o shell permite isso?

    
por Quentin 18.02.2013 / 05:01

1 resposta

5

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.

    
por 18.02.2013 / 07:24