あらかじめ明示的にリストせずに開いているすべてのファイル記述子を閉じる方法はありますか?
ベストアンサー1
文字通り答え、閉じるみんなファイル記述子を開くbash
:
for fd in $(ls /proc/$$/fd); do
eval "exec $fd>&-"
done
しかし、これはシェルの入力と出力に必要なデフォルトのファイル記述子を閉じるので、実際には良い考えではありません。これにより、実行しているすべてのプログラムは、tty
デバイスに直接書き込まない限り、端末に出力を表示しません。実際に私がテストした結果stdin
(exec 0>&-
)を閉じると、対話型シェルは終了しました。
実際に行うことは、デフォルトのシェル操作の一部ではないすべてのファイル記述子を閉じることです。これらはstdin
0、1、2stdout
ですstderr
。これに加えて、一部のシェルは基本的に別のファイル記述子を開くようです。bash
たとえば、255(端末I / Oにも使用されます)がありますが、dash
私の場合は10です。これは、/dev/tty
端末が使用する特定のtty
/ deviceではないことを示します。pts
0、1、2、255を除くすべての項目をオフにするには、次の手順を実行しますbash
。
for fd in $(ls /proc/$$/fd); do
case "$fd" in
0|1|2|255)
;;
*)
eval "exec $fd>&-"
;;
esac
done
これは、変数に含まれるファイル記述子をリダイレクトするときにもeval
必要です。それ以外の場合、bash
変数は拡張されますが、コマンドの一部として処理されます(この場合は、exec
コマンド0
または1
記述子を閉じたいすべてのファイルを試してください)。
メモ:ls
また、(例えば)の代わりにglobを使用すると、glob用の追加の/proc/$$/fd/*
ファイル記述子が開かれているように見えるため、ls
ここでは最良の解決策のようです。
修正する
移植性の詳細については、/proc/$$/fd
次を参照してください。ファイル記述子リンクの移植性。ご利用できない場合は/proc/$$/fd
代替品(使用可能な場合)を差し上げます。$(ls /proc/$$/fd)
lsof
$(lsof -p $$ -Ff | grep f[0-9] | cut -c 2-)