在bourne脚本中重定向stdin之后获取用户输入

时间:2009-09-06 10:41:52

标签: shell sh

(这是间接更大的家庭作业的一部分)

我有类似

的东西
    while read LINE
    do
        stuff-done-to-$LINE
        echo "Enter input:"
        read INPUT
        stuff-done-to-$INPUT
    done < infile

我找不到使用console / default stdin进行第二次读取的成功方法,而不是重定向的stdin。

需要纯粹的bourne脚本。

4 个答案:

答案 0 :(得分:3)

我相信Bourne shell支持这个:

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

输入在文件和用户之间交替。实际上,这是从文件中发出一系列提示的简洁方法。

这会将文件“infile”重定向到第一个read获取其输入的文件描述符号3。文件描述符0为stdin,1为stdout,2为stderr。您可以使用其他FD。

我在Bash和Dash上测试了这个(在我的系统上sh符号链接到破折号)。

当然有效。这里有一些更有趣的事情:

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

这会交替打印两个文件的内容,丢弃任何文件较长的额外行。

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只有两行。第二行和后续的doc2行将被丢弃。

答案 1 :(得分:2)

您可以通过/ dev / tty读取/写入用户的终端,这与您使用的shell以及是否重定向stdin / stdout无关,因此您只需要:

echo "Enter input:" > /dev/tty
read INPUT < /dev/tty

答案 2 :(得分:1)

这应该有效:

for LINE in `cat infile`; do
   stuff-done-to-$LINE
   echo "Enter input:"
   read INPUT
   stuff-done-to-$INPUT
done

答案 3 :(得分:-2)

你做不到。没有默认的stdin和重定向的stdin。有stdin,它连接的是控制台或文件。

你唯一能做的就是在文件行数上使用计数器。然后,使用sed或tail + head的一些智能使用来提取每一行。您无法使用while read line,因为您无法区分读取控制台和读取文件。