Como posso adquirir um fd para leitura com o Bash para que eu possa ramificar no código de saída sem mais efeitos colaterais? Isso é sucesso e fracasso sem o ramo:
$ set -u # -ue actually
$ exec {foo}</etc/fstab
$ echo $foo
10
$ exec {bar}</ENOENT
bash: /ENOENT: No such file or directory
$ echo $?
1
$ echo $bar
bash: bar: unbound variable
É assim que imagino codificar o ramo:
$ if exec {baz}</etc/fstab ; then echo good: fd=$baz ; else echo failure ; fi
No entanto, se a operação falhar, recebo uma mensagem indesejada:
$ if exec {xyzzy}</ENOENT ; then echo $xyzzy ; else echo failure ; fi
bash: /ENOENT: No such file or directory
failure
que eu não consigo me livrar redirecionando stderr (nem stdout):
$ if exec {quz}</ENOENT 2>/dev/null; then echo $quz ; else echo failure ; fi
bash: /ENOENT: No such file or directory
failure
Além disso, se o acima for realmente bem-sucedido, o shell (versão 4.4.12 (1) -release) trava indefinidamente ... eu acredito que isso é porque o fd é atribuído ao processo de shell atual.
Qual é a melhor estratégia para obter de forma limpa o fd para leitura que permite verificando o status de saída e não emite nenhuma saída adicional?