14

bashスクリプトを書くとき。npm、composer などの別のプログラムを開くコマンドを実行している場合がありますが、同時にread、ユーザーにプロンプ​​トを表示するために使用する必要があります。

この種のエラーに遭遇することは避けられません:

read: read error: 0: Resource temporarily unavailable

いくつかの調査を行った後、bash スクリプトの STDIN を操作するプログラムの STDIN を /dev/null にパイプすることで解決策があるようです。

何かのようなもの:

npm install </dev/null

他の調査では、STDIN がある種のブロッキング/非ブロッキング状態に設定されており、プログラムの終了後にリセットされていないという事実と関係があることが示されています。

問題は、STDIN を操作するプログラムの影響を受けず、STDIN を /dev/null にリダイレクトする必要があるプログラムを探す必要がなく、ユーザープロンプト入力を読み取るための、ある種の絶対確実でエレガントな方法があることです。これらのプログラムの STDIN を使用する必要さえあるかもしれません!

4

6 に答える 6

9

通常、呼び出されたプログラムがどのような入力をどこから期待しているかを知ることが重要です。そのため、標準入力を /dev/null からリダイレクトしても問題ありません。

それでも、シェル自体と呼び出されたすべてのプログラムに対してそれを行うことは可能です。stdin を別のファイル記述子に移動し、その場所で /dev/null を開きます。このような:

exec 3<&0 0</dev/null

上記は、ファイル記述子 3 の下に stdin ファイル記述子 (0) を複製し、/dev/null を開いてそれを置き換えます。

この後、stdin を読み取ろうとするコマンドは、/dev/null から読み取られます。元の stdin を読み取る必要があるプログラムは、ファイル記述子 3 からリダイレクトする必要があります。次のようにします。

read -r var 0<&3

リダイレクト演算子は、<省略された場合、宛先ファイル記述子 0 を想定するため、上記の 2 つのコマンドは次のように記述できます。

exec 3<&0 </dev/null
read -r var <&3
于 2013-11-11T22:09:49.100 に答える