less прокрутите до конца, не блокируя

У вас есть существующая программа, которая считывает четыре элемента из своего стандартного ввода, и вы хотели бы ввести данные в программу, фактически не взаимодействуя с ней.

Вы можете подготовить текстовый файл(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
1
13.11.2019, 18:56
1 ответ

Я справляюсь с этим следующим образом: записываю вывод в файл, а затем выгружаю файл. Используя ваш пример, это будет

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 , что также затрагивает процесс, генерирующий выходные данные для просмотра. К сожалению, обычно это контрпродуктивно.

2
27.01.2020, 23:29

Теги

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