Я пытаюсь читать из stdin многократно в сценарии оболочки без удачи. Намерение состоит в том, чтобы прочитать список файлов сначала (которые читаются из канала stdin), и затем читайте вдвое больше для получения двух строк в интерактивном режиме. (Что я пытаюсь сделать, читается список файлов для присоединения в электронном письме, тогда предмет и наконец почтовое тело).
До сих пор у меня есть это:
photos=($(< /dev/stdin))
echo "Enter message subject"
subject=$(< /dev/stdin)
echo "Enter message body"
body=$(< /dev/stdin)
(плюс код проверки ошибок, который я опускаю для succintness),
Однако это получает пустой предмет и тело, по-видимому, потому что вторые и третьи перенаправления получают EOF.
Я пытался закрыть и вновь открыть stdin с <&-и материал, но это, кажется, не прокладывает себе путь.
Я даже пытался использовать разделитель для списка файлов, с помощью "в то время как; считайте строку" цикл и убегите из цикла, когда разделитель был обнаружен. Но это не работало также (??).
Какие-либо идеи, как создать что-то вроде этого?
Итак, что я в итоге сделал, основано на ответе ezpz и этом доке: http://www.faqs.org/docs/abs/HTML/io-redirection.html В основном, я сначала запрашиваю поля из /dev/tty, а затем читаю 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<&-
fotos=($(< /dev/stdin))
Спасибо!
Так как возможно, что у вас разное количество фотографий, почему бы не запросить сначала известные поля, а потом прочитать "все остальное". Это намного проще, чем пытаться получить последние два поля неизвестной длины интерактивным способом
. Вы должны иметь возможность использовать read
, чтобы запрашивать тему и текст:
photos=($(< /dev/stdin))
read -rp "Enter message subject" subject
read -rp "Enter message body" body