5

所以我想通过将命令的输出传递到| less -S

但是,如果我这样做,一旦退出 less,命令的输出将不会保留在命令行历史记录中

有没有办法配置 less 以在退出时将命令的输出保留在历史记录中?

例如。如果您查看git diff,您可以执行水平滚动然后退出,但输出仍保留在历史记录中,您可以在其中键入新命令...我基本上想为我的自定义 bash 命令模拟这个。此外,git diff它在现场执行水平滚动(即不使用新屏幕)并且命令行历史记录仍然可见,而less它会在自己的屏幕上执行,您将无法看到命令行历史记录,而“减”。是否也可以在 less 中模拟这种类似 git diff 的机制?

如果有其他没有使用的解决方案,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$

将留在屏幕上

我如何让这也发生

4

3 回答 3

11

我现在无法访问任何可以运行git diff的东西,但是如果我正确阅读了您的问题和评论,我认为 -X 选项 less 会有所帮助。例如

ls -la | less -SX

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

更新

我拉了一个 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
于 2013-10-10T16:04:55.633 回答
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资源xterm

应该有更简单的方法来做到这一点,但我还没有找到。)

更新 :

正如DigitalTrauma 的回答所指出的那样,-X(or --no-init) 选项用于less禁止 termcap/terminfo 初始化和取消初始化字符串(ti/te在 termcap 中,smcup/rmcup在 terminfo 中)。添加-Xless命令行选项或添加X$LESS环境变量应该可以解决问题。

请注意,这仅适用于less. 其他全屏命令,例如文本编辑器,仍将默认保存和恢复屏幕。使用titeInhibitfor 的资源xterm,或破解您的termcaporterminfo条目以删除这些转义序列,将提供更通用的解决方案。

于 2013-10-10T15:54:00.173 回答
0

尝试这个 :

export LESS=X # it might be what you are looking for
于 2013-10-10T16:09:55.407 回答