чтение stdin многократно в ударе

Я пытаюсь читать из stdin многократно в сценарии оболочки без удачи. Намерение состоит в том, чтобы прочитать список файлов сначала (которые читаются из канала stdin), и затем читайте вдвое больше для получения двух строк в интерактивном режиме. (Что я пытаюсь сделать, читается список файлов для присоединения в электронном письме, тогда предмет и наконец почтовое тело).

До сих пор у меня есть это:

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

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

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

(плюс код проверки ошибок, который я опускаю для succintness),

Однако это получает пустой предмет и тело, по-видимому, потому что вторые и третьи перенаправления получают EOF.

Я пытался закрыть и вновь открыть stdin с <&-и материал, но это, кажется, не прокладывает себе путь.

Я даже пытался использовать разделитель для списка файлов, с помощью "в то время как; считайте строку" цикл и убегите из цикла, когда разделитель был обнаружен. Но это не работало также (??).

Какие-либо идеи, как создать что-то вроде этого?

7
задан alvherre 2 January 2010 в 18:20
поделиться

3 ответа

Итак, что я в итоге сделал, основано на ответе 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))

Спасибо!

6
ответ дан 6 December 2019 в 23:06
поделиться

Так как возможно, что у вас разное количество фотографий, почему бы не запросить сначала известные поля, а потом прочитать "все остальное". Это намного проще, чем пытаться получить последние два поля неизвестной длины интерактивным способом

.
2
ответ дан 6 December 2019 в 23:06
поделиться

Вы должны иметь возможность использовать read , чтобы запрашивать тему и текст:

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

read -rp "Enter message subject" subject

read -rp "Enter message body" body
3
ответ дан 6 December 2019 в 23:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: