Ao contrário dos redirecionamentos em outros comandos, os redirecionamentos no exec
builtin podem ser fechados quando o shell executa um programa externo. POSIX permite ambos os comportamentos . Ksh (ambos ATT ksh e pdksh e mksh) fecham esses descritores quando executam um utilitário externo (por exemplo, para um redirecionamento no exec
builtin, depois de chamar dup2
para executar o redirecionamento, eles definem o FD_CLOEXEC
flag on o novo descritor). O shell Bourne, dash, bash, zsh e BusyBox sh tratam esse redirecionamento como qualquer outro redirecionamento.
Uma solução mais portátil para o problema de dois canais de entrada (assumindo a existência de /dev/fd
) é executar outro redirecionamento no comando que lê a entrada, movendo o descritor de arquivo para um novo. Esse redirecionamento extra não define o sinalizador close-on-exec no novo descritor.
sort a | { exec 3<&0; sort b | comm -12 /dev/fd/0 /dev/fd/4 4<&3; }
Isso funciona no pdksh / mksh e no ksh93r, mas não nas versões recentes do ksh (93s + 2008-01-31 ou 93u + 2012-08-01). Eu não entendo o que o ksh está fazendo lá.