stdinがボーンスクリプトでリダイレクトされた後にユーザー入力を取得する

StackOverflow https://stackoverflow.com/questions/1385380

  •  21-09-2019
  •  | 
  •  

質問

(これは間接的にはるかに大きな宿題の割り当ての一部です)

私はどんなものを持っています

    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 コンソールからの読み取りとファイルからの読み取りを区別する方法がないからです。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top