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