Bash:読み取りループ内で入力を読み取ることが機能しない


14

while読み取りループ内で入力を読み取ることが機能していないようです

while read line
do
 echo "get some input from the user"
 read response
done < some_file.txt

実行がループの外で行われた場合のように一時停止することはありません。どうしてこれなの?while読み取りループ内で入力を読み取るための回避策はありますか?

回答:


15

問題は、read lineread responseからのデータを期待(および取得)することですstdin。SOに関する
この質問では、その一部について、さらに詳細な情報へのリンクとともに説明しています。

tl; dr
受け入れられた回答は次のことを示唆しています。

制御端末デバイスから読み取る: read input </dev/tty


16

内部の読み取りコマンドでstdinを使用し、whileループに別のファイル記述子を使用する

while read -u 3 line; do
  read -p "get some input from the user" response
done 3< some_file.txt

1

ニフレはそれを正確に持っています。ただし、複数の端末を使用している場合は、具体的に指定する必要があります。

グーグルから来たあなたのために、このページを見つけるおめでとうございます。あなたは(これは含むが読み取りループ中に任意のユーザ入力を行う必要がある場合rm -ireadまたは何か他のもの)は、使用する入力パイプを指定することができます。

これが私が使用したこのソリューションの断片です:

#in declarations
thistty=$(tty)

lsuser -R LDAP -a home pgrp ALL 2>/dev/null | while read line
do
   homedir=$(echo $homedir | awk -F= '{print $2}')
   sudo rm -ir "$homedir" < $thistty
done

1

ありがとうNifle!また、bgStackにも感謝します。時間を検索した後、私はようやく答えを得ました!偉大な者!!「echo $(tty)」を使用して端末パスを検出したか、変数として取得しただけです。私にとっては別のユースケースでした。Uはファイルを読み取っていて、実行を確認したいと考えています。たぶん、以下の例は誰か他の人を助けるでしょう。

#!/bin/bash

export terminal=$(tty)

cat file | while read val1 val2
do
   while true; 
            do
              read -p "would you like to XYZ" yn
              case $yn in
                        [Yy]* )     echo "# Move $val1 to $val2        #";break;;
                        [Nn]* )     echo "#---------no action----------#";break;;
                        * )         echo "# Please answer yes or no.   #";;
              esac
            done < $terminal
done

私の場合while、パイプから読み取りを行っていました...そして、リダイレクトを使用してstdin:から読み取りましたread something < %terminal
eftshift0
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.