2

我尝试创建一个单行,用于less在来自标准输入的多屏幕输出的最后一个屏幕上打开。这样做的原因是我正在开发一个产生 long 的程序,AST我需要能够上下遍历它,但我更愿意从底部开始。我想出了这个:

$ python a.py 2>&1 | tee >(lines=+$(( $(wc -l) - $LINES))) | less +$lines

首先,我需要计算输出中的行数并$LINES从中减去,这样我就知道最后一个屏幕的最上面一行是什么。稍后我将需要重用a.py输出,因此tee为此目的我使用了进程替换。作为最后一步,我指出less在特定行上打开原始标准输出。当然,它不起作用,Bash因为$lines没有在最后一步设置,因为每个子命令都在子 shell 中运行。在ZSH中,即使管道命令不在子 shell 中运行,进程替换仍然存在,因此它也不起作用。这不是家庭作业或工作任务,我只是想知道是否可以在不创建临时文件BashZSH. 有任何想法吗?

4

2 回答 2

4

less天生支持这一点。您正在使用的+语法接受您在运行时可以输入的任何较少的命令,包括Ggo-to-end。

... | less +G

做你想要的。

这实际上在手册页中作为示例明确提到(搜索“+G”)。

于 2016-01-07T23:37:10.213 回答
1

您问题的真正答案应该是 的选项+Gless但您指出问题定义不能代表您要解决的抽象问题。因此,请考虑这个替代问题:

python a.py 2>&1 | \
awk '
  {a[NR]=$0}
  END{
    print NR
    for (i=1;i<=NR;i++)print a[i]
   }
 ' | {
     read -r l
     less -j-1 +$l
 }

awk命令正在打印行数,然后按顺序打印所有行。我们定义第一行来包含一些元信息。{这通过管道传送到由和分隔的一组命令}。第一行由 消耗read,它将其存储在变量 中$l。其余的行由less,其中可以使用此变量。-j-1被使用,所以匹配的行在屏幕的底部。

于 2016-01-08T00:08:48.613 回答