verificado e aquisição silenciosa de um fd com exec

0

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?

    
por phg 13.04.2018 / 17:09

0 respostas