stdinがボーンスクリプトでリダイレクトされた後にユーザー入力を取得する
質問
(これは間接的にはるかに大きな宿題の割り当ての一部です)
私はどんなものを持っています
while read LINE do stuff-done-to-$LINE echo "Enter input:" read INPUT stuff-done-to-$INPUT done < infile
リダイレクトされたstdinの代わりに、2番目の読み取りにコンソール/デフォルトのstdinを使用する成功した方法を見つけることができません。
純粋なボーンスクリプトである必要があります。
解決
これはボーンシェルでサポートされていると思います。
exec 3<doc.txt
while read LINE <&3
do
stuff-done-to-$LINE
# the next two lines could be replaced by: read -p "Enter input: " INPUT
echo "Enter input:"
read INPUT
stuff-done-to-$INPUT
done < infile
入力は、ファイルとユーザーの間で交互に行われます。実際、これはファイルから一連のプロンプトを発行するためのきちんとした方法です。
これにより、ファイルが最初のファイル記述子番号3に「インフィル」をリダイレクトします。 read
入力を取得します。ファイル記述子0は stdin
, 、1 is stdout
と2は stderr
. 。他のFDと一緒に使用できます。
これをBashとDashでテストしました(私のシステムでは、SHはDashにシンプルされています)。
もちろん、それはうまくいきます。 これがもっと楽しいです:
exec 3<doc1.txt
exec 4<doc2.txt
while read line1 <&3 && read line2 <&4
do
echo "ONE: $line1"
echo "TWO: $line2"
line1=($line1) # convert to an array
line2=($line2)
echo "Colors: ${line1[0]} and ${line2[0]}"
done
これにより、2つのファイルの内容を印刷して、どのファイルが長くなるかどうかの追加行を破棄します。
ONE: Red first line of doc1
TWO: Blue first line of doc2
Colors: Red and Blue
ONE: Green second line of doc1
TWO: Yellow second line of doc2
Colors: Green and Yellow
DOC1には2行しかありません。 Doc2の3行目と後続の線は破棄されます。
他のヒント
/dev/ttyを介してユーザーの端末を読み込む/書き込むことができます。これは、使用しているシェルとstdin/stdoutがリダイレクトされているかどうかに依存しないため、次の必要があります。
echo "Enter input:" > /dev/tty
read INPUT < /dev/tty
これは機能するはずです:
for LINE in `cat infile`; do
stuff-done-to-$LINE
echo "Enter input:"
read INPUT
stuff-done-to-$INPUT
done
できません。デフォルトのstdinとリダイレクトされたstdinはありません。 stdinがあり、接続されているのはコンソールまたはファイルのいずれかです。
あなたができる唯一のことは、あなたのファイルの行の数でカウンターを使用することです。次に、SEDまたはTail+Headのスマートな使用を使用して、各ラインを抽出します。使用できません while read line
コンソールからの読み取りとファイルからの読み取りを区別する方法がないからです。