Я пытаюсь создать однострочник для открытия less
на последнем экране многоэкранного вывода, поступающего из стандартного ввода. Причина этого в том, что я работаю над программой, которая создает длинное AST
, и мне нужно иметь возможность перемещаться по ней вверх и вниз, но я бы предпочел начать снизу. Я придумал это:
$ python a.py 2>&1 | tee >(lines=+$(( $(wc -l) - $LINES))) | less +$lines
Во-первых, мне нужно вычислить количество строк в выводе и вычесть из него $LINES
, чтобы я знал, какая самая верхняя строка на последнем экране. Позже мне нужно будет повторно использовать вывод a.py
, поэтому для этой цели я использую tee
с заменой процесса. В качестве последнего шага я указываю less
, чтобы открыть исходный стандартный вывод в определенной строке. Конечно, это не работает в Bash
, потому что $lines
не устанавливается на последнем шаге, так как каждая подкоманда запускается в подоболочке. В ZSH
, несмотря на то, что команды канала не выполняются в подоболочке, подстановка процесса все еще выполняется, и поэтому она тоже не работает. Это не домашняя и не рабочая задача, мне просто интересно, можно ли делать то, что я хочу, не создавая временный файл в Bash
или ZSH
. Любые идеи?
stdin
, используяread
, вот так:echo one two | { read l; echo $l ;}
. Однако я не совсем уверен, как это будет работать с выводом, который состоит не только из чисел, поэтому он бесполезен для моей конкретной проблемы, но в любом случае хорош. 08.01.2016for
наpython a.py 2>&1
.awk
вprint NR
сделает метаданные пригодным для использования числом, независимо от ввода. 08.01.2016awk
делает, чтобы не потерять стандартный ввод, копирует его целиком + добавляет несколько строк сверху, которые позже устанавливаютсяread
? Действительно, очень умный. Я пытался использоватьtee
для этой цели, но не смог установить переменную в конвейере, это решение решает эту проблему. 08.01.2016awk
может запустить "меньше" с'{a[NR]=$0;} END{ for(i=1;i<=NR;i++) print a[i] | "less -j-1 +" NR }'
. 08.01.2016