bashスクリプトを開くときに3以上のファイル記述子(FD)に追加情報を出力したいです。 FDがオンになっているかどうかをテストするために、次のトリックを考案しました。
if (printf '' 1>&3) 2>&-; then
# File descriptor 3 is open
else
# File descriptor 3 is not open
fi
これは私の要件には十分ですが、FDが動作しているかどうかをテストするより慣用的な方法があるかどうか疑問に思います。私は特に、FDフラグの検索(およびFDが書き込み可能かどうかをテストし、FDを読み取ることができるかどうかをテストする)を可能にするfcntl(1)
シェルコマンドへのシステムコールマッピングがあるかどうかに興味があります。O_WRONLY
O_RDWR
O_RDONLY
O_RDWR
ベストアンサー1
ksh
(AT&Tおよびpdkshバリアント)では、zsh
次のことができます。
if print -nu3; then
echo fd 3 is writeable
fi
fdに何も書きませんが、fdが書き込み可能かどうかをfcntl(3, F_GETFL)
確認し、それ以外の場合はエラーを報告します。
$ ksh -c 'print -nu3' 3< /dev/null
ksh: print: -u: 3: fd not open for writing
(にリダイレクトできます/dev/null
)。
bash
私はあなたの唯一のオプションはあなたの方法のようにfdが成功したことを確認することだと思います。しかし、これはfdが書き込み可能であることを保証するものではありません(またはそうするためにdup()
外部ユーティリティ(zsh
/ ...)を呼び出します)。perl
fcntl()
(ほとんどのシェルと同様に)代わりにをbash
使用すると、追加のプロセスが分岐します。あなたはそれを使用することができます:(...)
{...;}
if { true >&3; } 2> /dev/null
むしろ、ブランチを避けることです(複合コマンドをリダイレクトすると、常にサブシェルが生成されるBourneシェルを除く)。:
代わりに使用しないでくださいtrue
。特別な組み込みのため、bashがPOSIX互換モードになっているとシェルは終了します。
ただし、次のように短縮できます。
if { >&3; } 2> /dev/null