Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 在不清除命令行历史记录中的输出的情况下,将管道传输到less-S_Linux_Bash_Shell_Command Line_Terminal - Fatal编程技术网

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

Linux 在不清除命令行历史记录中的输出的情况下,将管道传输到less-S,linux,bash,shell,command-line,terminal,Linux,Bash,Shell,Command Line,Terminal,因此,我希望通过管道将命令的输出传输到|less-S 但是,如果我这样做,一旦退出较少,命令的输出将不会保留在命令行历史记录中 是否有方法配置less,以便在退出less时将命令的输出保留在历史记录中 例如,如果您查看git diff,您可以执行水平滚动,然后退出,但输出仍然保留在历史记录中,您可以在其中键入新命令…我基本上想对我的自定义bash命令进行模拟。此外,在git diff中,它会当场执行水平滚动(即不使用新屏幕),并且命令行历史记录仍然可见,而对于less来说,它会在自己的屏幕中执行

因此,我希望通过管道将命令的输出传输到
|less-S

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

是否有方法配置less,以便在退出less时将命令的输出保留在历史记录中

例如,如果您查看git diff,您可以执行水平滚动,然后退出,但输出仍然保留在历史记录中,您可以在其中键入新命令…我基本上想对我的自定义bash命令进行模拟。此外,在
git diff
中,它会当场执行水平滚动(即不使用新屏幕),并且命令行历史记录仍然可见,而对于
less
来说,它会在自己的屏幕中执行,并且在“lessing”时,您将无法看到命令行历史记录。是否有可能在更少的时间内模拟这种类似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时,仅显示屏幕的最后一部分(即我向右滚动的屏幕的最后一部分)

将保留在屏幕上


我怎样才能让这也发生呢

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

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

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

command > command.log ; xterm -e less -S command.log
它很容易包装在函数或脚本中。如果您不在GUI环境中,
screen
可以执行非常类似的操作

另一个选项是,如果您希望退出后
less
的输出保持在当前窗口中(这将滚动屏幕顶部的shell命令历史记录),则使用不定义这些字符序列的
terminfo
定义。terminfo功能名称为
tmcup
rmcup
。您可以将终端模拟器配置为禁用这些功能;例如,有关
xterm
,请参阅
titeInhibit
资源

(应该有更简单的方法,但我还没有找到。)

更新:

如前所述,
-X
(或
-no init
)选项
less
禁止termcap/terminfo初始化和反初始化字符串(
ti
/
te
在termcap中,
smcup
/
rmcup
在terminfo中)。将
-X
添加到
less
命令行选项中,或者将
X
添加到
$less
环境变量中,都可以实现这一目的


请注意,这仅适用于
less
。默认情况下,其他全屏命令(如文本编辑器)仍将保存和恢复屏幕。使用
xterm
titeInhibit
资源,或者对
termcap
termfo
条目进行黑客攻击以删除这些转义序列,将提供一个更通用的解决方案。

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

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
试试这个:

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

“输出”永远不会进入命令行历史记录。你的意思是在终端的dislay/scrollback缓冲区中的“
more”
支持水平滚动吗?这是这里要求的吗?如果是这样,我不知道如何启用它。@ PialaFLASE——考虑编辑问题,以明确你是否真的意味着“命令行历史”或“滚动缓冲区”。提示-如果你这样做,你会得到我的支持:)@digitaltrampion我错过了水平部分。不,我认为没有。问题是如果你执行水平滚动(按右键等)它也不会清除水平滚动的所有输出,因此,如果向右滚动2次,输出将停留在那里3次,其中,当向右滚动时,其他2次将是输出…有没有办法让一个输出停留在那里,而不是让所有滚动输出停留在那里times@pillarOfLight-不完全是清楚你的评论是什么,但我明白-SX不适合你。所以我挖得更深一点,看看我更新的答案。我看了你更新的问题。据我所知,在我的系统上,
git diff
less-FRSX的行为是相同的。在这两种情况下,最初都会显示第1页行中的字符1-80。如果我点击空格,那么字符1-
export LESS=X # it might be what you are looking for