У меня есть сценарий bash, который выглядит примерно так:
cat filename | while read line
do
read input;
echo $input;
done
но это явно не дает мне правильного вывода, поскольку, когда я читаю в цикле while, он пытается прочитать имя файла из-за возможного перенаправления ввода-вывода.
Любой другой способ сделать то же самое?
bash
while-loop
w2lame
источник
источник
Ответы:
Считайте с управляющего оконечного устройства:
больше информации: http://compgroups.net/comp.unix.shell/Fixing-stdin-inside-a-redirected-loop
источник
bash yourscript < /foo/bar
будет ждать ввода пользователя, это допустимо только при чтении паролей. Ответ @GordonDavisson предпочтительнее для всех других целей.Вы можете перенаправить обычный stdin через модуль 3, чтобы сохранить его внутри конвейера:
Кстати, если вы действительно используете
cat
этот способ, замените его перенаправлением, и все станет еще проще:Или вы можете поменять местами stdin и unit 3 в этой версии - прочтите файл с модулем 3 и просто оставьте stdin в покое:
источник
read line
чтение из notify-finished, но если вы просто запустите его, как написано, этоread -u 3 input
будет чтение с консоли)?Похоже, вы читали дважды, чтение внутри цикла while не требуется. Кроме того, вам не нужно вызывать команду cat:
источник
read
поведение внутреннего как «неправильное [потому что] он пытается читать из файлаfilename
»), так и из принятого ими ответа.Попробуйте изменить цикл так:
Модульный тест:
источник
Я нашел этот параметр -u при чтении.
"-u 1" означает "читать из стандартного ввода"
источник
источник