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

Shell 在重定向stdin后,在bourne脚本中获取用户输入,shell,sh,Shell,Sh,(这间接地是一个更大的家庭作业的一部分) 我有点像 while read LINE do stuff-done-to-$LINE echo "Enter input:" read INPUT stuff-done-to-$INPUT done < infile 读行时 做 对-$LINE所做的事情 echo“输入:” 读取输入 已完成的工作-$INPUT 完成<;填充 我找不到一种成功的方法来使用控制台/默认

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

我有点像

while read LINE do stuff-done-to-$LINE echo "Enter input:" read INPUT stuff-done-to-$INPUT done < infile 读行时 做 对-$LINE所做的事情 echo“输入:” 读取输入 已完成的工作-$INPUT 完成<;填充 我找不到一种成功的方法来使用控制台/默认stdin进行第二次读取,而不是使用重定向的stdin


需要纯伯恩脚本

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

您唯一能做的就是在使用文件行数计数器时执行一段时间。然后,使用sed或tail+head提取每条线。您不能在读取行时使用
,因为您无法区分从控制台读取和从文件读取。

这应该可以:

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

我相信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
这将交替打印两个文件的内容,丢弃较长文件的多余行

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的第三行和后续行将被丢弃。

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

echo "Enter input:" > /dev/tty
read INPUT < /dev/tty
echo“输入:”>/dev/tty
读取输入
我应该详细说明第一点。。。这个问题/问题是针对我的作业解决方案的,不是家庭作业的一部分,但我的代码在非扩展Bourne中的要求是。纯Bourne脚本?你是说原来的bourne shell,不是bash?谢谢,我很害怕。我可能可以用不同的方式重写它,不过如果文件太大,tail+head会有点麻烦,sed也不会好多少。是的,你可以在/dev/tty上看到我的答案。+1:是和否。这会给你一个单词列表,而不是行列表。您必须将IFS更改为纯输入才能使您的方法正常工作,如果您不小心和/或还原它,可能会对内部代码产生可怕的后果。项目和问题早就不存在了,但我回去检查了相关的shell。。。是的,它确实支持文件描述符,所以您的第一个示例应该可以工作。第二个阵列示例失败。。。原始bourne shell中没有阵列。
echo "Enter input:" > /dev/tty
read INPUT < /dev/tty