在bash中多次读取stdin

在bash中多次读取stdin,bash,stdin,Bash,Stdin,我试图在shell脚本中多次读取stdin,但运气不佳。其目的是先读取文件列表(从stdin管道读取),然后再读取两次以交互方式获得两个字符串。(我要做的是阅读一份要附加在电子邮件中的文件列表,然后是主题,最后是电子邮件正文) 到目前为止,我有: photos=($(< /dev/stdin)) echo "Enter message subject" subject=$(< /dev/stdin) echo "Enter message body" body=$(< /d

我试图在shell脚本中多次读取stdin,但运气不佳。其目的是先读取文件列表(从stdin管道读取),然后再读取两次以交互方式获得两个字符串。(我要做的是阅读一份要附加在电子邮件中的文件列表,然后是主题,最后是电子邮件正文)

到目前为止,我有:

photos=($(< /dev/stdin))

echo "Enter message subject"
subject=$(< /dev/stdin)

echo "Enter message body"
body=$(< /dev/stdin)
照片=($( (加上为了简洁而省略的错误检查代码)

然而,这会得到一个空的主题和主体,可能是因为第二个和第三个重定向得到EOF


我一直在尝试用关闭和重新打开stdin,因为您可能有不同数量的照片,为什么不先提示输入已知字段,然后读取“其他所有内容”。这比以交互方式获取长度未知的最后两个字段要容易得多。

您应该能够使用
read
提示输入主题和正文:

photos=($(< /dev/stdin))

read -rp "Enter message subject" subject

read -rp "Enter message body" body
照片=($(因此,我最终所做的是基于ezpz的答案和本文档:基本上,我首先从/dev/tty提示输入字段,然后使用dup和close技巧读取stdin:

# close stdin after dup'ing it to FD 6
exec 6<&0

# open /dev/tty as stdin
exec 0</dev/tty

# now read the fields
echo "Enter message subject"
read subject
echo "Enter message body"
read body

# done reading interactively; now read from the pipe
exec 0<&6 6<&-
photos=($(< /dev/stdin))
#将标准数据复制到FD 6后关闭标准数据

行政长官:谢谢。如果我以交互方式输入数据,则该操作有效。然而,如果我使用管道(这是我真正感兴趣的),它不会。例如,我正在尝试这样做:cat/tmp/somephotoids | sed-e's/(.*)/DSC\u1.jpg/'| sendpics.sh,而我可以通过剪切粘贴来解决这个问题,我花了足够的时间这样做,现在我认为这是一种挑战。不适合我的原因是我试图用管道来传递照片列表。如果我只是简单地阅读列表前的这些字段,列表中的前两张照片最终成为主题和电子邮件正文,这不是我想要的。(当然,我可以规定主体和主体必须在输入管道的前两行中传递,但这对我来说太难看了。)