Em ksh
(variantes AT & T e pdksh) ou zsh
, você pode fazer:
if print -nu3; then
echo fd 3 is writeable
fi
Eles não escrevem nada nesse fd, mas ainda verificam se o fd é gravável (usando fcntl(3, F_GETFL)
) e relatam um erro do contrário:
$ ksh -c 'print -nu3' 3< /dev/null
ksh: print: -u: 3: fd not open for writing
(que você pode redirecionar para /dev/null
).
Com bash
, acho que sua única opção é verificar se um dup()
é bem-sucedido em sua abordagem, embora isso não garanta que o fd seja gravável (ou chame um utilitário externo ( zsh
/ perl
...) para fazer o fcntl()
).
Observe que, em bash
(como a maioria dos shells), se você usar (...)
em vez de {...;}
, isso resultará em um processo extra. Você pode usar:
if { true >&3; } 2> /dev/null
, em vez de evitar a bifurcação (exceto no shell Bourne, em que o redirecionamento de comandos compostos sempre causa um subshell). Não use :
em vez de true
, pois isso é um especial incorporado, portanto, o shell sairá quando o bash estiver no modo de conformidade POSIX.
Você pode, no entanto, encurtá-lo para:
if { >&3; } 2> /dev/null