在不清除命令行历史记录输出的情况下,将管道减少到-S

时间:2013-10-10 15:31:59

标签: linux bash shell command-line terminal

所以我希望通过将命令的输出传递给| less -S

,在终端中为我的自定义bash命令提供水平滚动

但是,如果我执行此操作,一旦退出较少,该命令的输出将不会保留在命令行历史记录中

当你退出时,有没有办法配置less以保持历史记录中命令的输出?

EG。如果你看git diff,你可以执行水平滚动然后退出,但输出仍然保留在历史记录中,然后你可以输入新的命令...我本质上想要为我的自定义bash命令模拟这个。同样在git diff中,它在现场执行水平滚动(即不使用新屏幕),命令行历史记录仍然可见,而对于less,它将在自己的屏幕中执行并且您赢了能够在“减少”时看到命令行历史记录。是否有可能在较少的情况下模拟这种git diff-like机制?

如果没有使用less的任何其他解决方案随时将其丢弃

更新的问题

假设我这样做:

cat loremipsum | less -FRSX

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nullam sed 

然后我向右按两次,使其向右滚动两次。然后我按q退出更少。屏幕上保留的输出将是:

cat loremipsum | less -FRSX

 Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nullam sed 

 ESCOC

dictum diam. Nullam quis urna ullamcorper, accumsan quam vitae, aliquet 

 ESCOD

nisl. Maecenas vitae lorem orci. Ut vel est erat. Cras quis sagittis sapien, ac volutpat metus. 

 username@server:~/httpdocs$

然而在git diff中你做同样的事情然后按q,只有最后一部分(即我滚动到右边的屏幕的最后部分)

 git diff

nisl. Maecenas vitae lorem orci. Ut vel est erat. Cras quis sagittis sapien, ac volutpat metus. 

 username@server:~/httpdocs$

将保留在屏幕上

我如何才能实现这一目标

3 个答案:

答案 0 :(得分:10)

我现在无法访问任何可以运行git diff的内容,但如果我正确地阅读了您的问题和评论,我认为-X选项可以帮助您。 e.g。

ls -la | less -SX

这可以防止在显示输出之前保存和清除屏幕,以及在退出时清除和恢复屏幕。

<强>更新

我拉了一个git工作区并找出git diff实际在做什么:

$ pstree -p | grep git
        |-xterm(6021)---bash(6023)---sh(6104)---git(17708)---less(17709)
$ cat /proc/17709/cmdline | xargs -0 echo
less
$ cat /proc/17709/environ | xargs -0 --replace echo {} | grep LESS
LESSOPEN=|/usr/bin/lesspipe.sh %s
LESS=FRSX
$ 

因此git diff没有向less传递任何选项。相反,它将LESS环境变量设置为FRSX。这与将-FRSX选项传递给less相同。那么,你是否得到了你需要的-FRSX:

ls -la | less -FRSX

答案 1 :(得分:2)

这不是命令行历史记录,它是终端仿真器的回滚缓冲区。

使用curses或ncurses的命令通常使用转义序列,在退出时启动时保存和恢复终端的状态。启动时,序列切换到辅助显示缓冲区,其中命令显示其所有输出。退出时,另一个序列切换回主缓冲区并恢复光标位置。这使您可以编辑或查看文件,然后在完成后仍然可以看到shell命令历史记录。

一种解决方法是在另一个窗口中调用less(或vim或其他),您可以在shell中运行命令时保持运行。例如,如果您使用xterm,则可以键入以下内容:

command > command.log ; xterm -e less -S command.log

很容易包装在函数或脚本中。如果您不在GUI环境中,screen可以执行非常类似的操作。

另一个选项,如果您希望退出后less的输出保留在当前窗口中(这会将您的shell命令历史记录从屏幕顶部滚动)是使用terminfo没有定义那些字符序列的定义。 terminfo功能名称为tmcuprmcup。您可以配置终端仿真器以禁用这些功能;例如,请参阅titeInhibit的{​​{1}}资源。

应该是一种更简单的方法,但我还没有找到它。)

更新:

正如DigitalTrauma's answer所指出的,xterm的{​​{1}}(或-X)选项会禁止termcap / terminfo初始化和取消初始化字符串(--no-init / {在termcap中{1}},在terminfo中less / ti。将te添加到smcup命令行选项,或将rmcup添加到-X环境变量,应该可以解决问题。

请注意,这仅适用于less。其他全屏命令(如文本编辑器)仍默认保存和恢复屏幕。使用X $LESS资源或攻击lesstiteInhibit条目以删除这些转义序列,将提供更通用的解决方案。

答案 2 :(得分:0)

试试这个:

export LESS=X # it might be what you are looking for