、あなたは与えられたファイルディスクリプタ(この場合は3
)が利用可能であるかどうかを確認するために、次のメソッドを使用することができます。
rco="$(true 2>/dev/null >&3; echo $?)"
rci="$(true 2>/dev/null <&3; echo $?)"
if [[ "${rco}${rci}" = "11" ]] ; then
echo "Cannot read or write fd 3, hence okay to use"
fi
これは基本的にあなたが読み取りまたは書き込みができるかどうかを試験することにより動作します与えられたファイルハンドル。あなたがどちらもすることができないと仮定すると、おそらく大丈夫です。そのスクリプトを実行する
が
exec 3>/dev/null # Testing, comment out to make
exec 4</dev/null # descriptor available.
found=none
for fd in {0..200}; do
rco="$(true 2>/dev/null >&${fd}; echo $?)"
rci="$(true 2>/dev/null <&${fd}; echo $?)"
[[ "${rco}${rci}" = "11" ]] && found=${fd} && break
done
echo "First free is ${found}"
最初の自由記述子として5
を与えますが、あなたはどのように見てexec
ラインで遊ぶことができます:最初の自由記述をを見つけるの面で
、あなたのようなものを使用することができますより早いものを利用できるようにすると、コードスニペットがそれを見つけることができます。
としては、コメントで指摘し、procfs
を提供するシステム(/proc
ファイルシステム)は、彼らが自由記述子を検出することが可能な別の方法を持っています。次のように/proc/PID/fd
ディレクトリには、各オープンファイル記述子のエントリが含まれます:ちょうど保つ
exec 3>/dev/null # Testing, comment out to make
exec 4</dev/null # descriptor available.
found=none
for fd in {0..200} ; do
[[ ! -e /proc/$$/fd/${fd} ]] && found=${fd} && break
done
echo "First free is ${found}"
:
pax> ls -1 /proc/$$/fd
0
1
2
255
だから、そこに自由なエントリを見つけるために、上記のものと同様のスクリプトを使用することができますbash
を提供するすべてのシステムが必ずしもprocfs
(BDSとCygWinが例です)を持つとは限りません。もしそれがあなたがターゲットとしているOSなら、Linuxでうまくいくはずです。もちろん
、あなたはがようなものとして、あなたの全体のシェルスクリプトをラップするオプション持たまだやる:その場合は
(
# Your current script goes here
)
を、ファイルハンドルは、それらの括弧とあなたの外に保存されますあなたが適切に見える範囲でそれらを操作することができます。
'['または' [[['ファイル記述子を開く'をテストする[' ']オプションは表示されません。最も近いアプローチは、ファイルディスクリプタが端末に接続されているかどうかをテストする '-t number'です。数字を解釈するスクリプトを取得するのは地獄です。 '>&$ number'を使うことはできませんので、サブシェルなどで混乱させる必要があります。与えられたファイル記述子をテストするプログラムを書くのは難しくありませんが、任意の数を使うようにシェルスクリプトを生成するのは難しいかもしれません。したがって、ほとんどの人は気にしません。 –