У вас есть существующая программа, которая считывает четыре элемента из своего стандартного ввода, и вы хотели бы ввести данные в программу, фактически не взаимодействуя с ней.
Вы можете подготовить текстовый файл(input.txt
)такого вида (данные взяты из текста вашего вопроса):
1
1
abc/abc@xyz
ENV_NO
Затем вы можете запустить свой скрипт следующим образом:
$./abc.sh <input.txt
Это заставит сценарий интерактивно читать из файла, а не с клавиатуры. Любой вывод из скрипта по-прежнему будет отображаться на терминале (как вопросы для ввода ), но ввод будет считываться из данного файла.
Вместо файла можно также использовать здесь -документ:
./abc.sh <<END_INPUT
1
1
abc/abc@xyz
ENV_NO
END_INPUT
Я справляюсь с этим следующим образом: записываю вывод в файл, а затем выгружаю файл. Используя ваш пример, это будет
i=0; while true; i=$((i+1)); do echo $i; sleep 0.001; done >/tmp/somefile
less /tmp/somefile
Недостатком является то, что в зависимости от процесса, генерирующего выходные данные, /tmp/somefile
может увеличиваться произвольно.
Причина записи/чтения из файла, а не через канал, прагматична. Утилита less
имеет различный ответ в зависимости от того, читает ли она из канала или из файла. При чтении из файла он «знает» конец файла и может сразу искать его. Если файл позже увеличится, другой поиск -в -конец(G
)переопределит конечную точку и повторит поиск в этой новой точке. С другой стороны, поиск конца трубы будет блокироваться до тех пор, пока труба не будет закрыта. (Этот эффект блокировки применяется независимо от того, буферизован канал или нет. )Как только less
заблокируется, он будет реагировать только на Ctrl C , что также затрагивает процесс, генерирующий выходные данные для просмотра. К сожалению, обычно это контрпродуктивно.