有没有办法在 bash 中重现'less'屏幕行为?



我尝试制作一个简单的bash脚本,运行多个工具,如dehader,cppcheck和一堆自定义工具,并且为了可读性,它在每个工具之间清理终端,并等待用户在运行下一个工具之前按下enter键。

clear
rm *.o
echo "removed object files"
rm __pycache__
echo "removed python cache files"
echo "everything cleaned, press enter to continue"
read a
clear
deheader
echo "deheader done, press enter to continue"
read a
clear
cppcheck
echo "cpp check done, press enter to exit"
read a
clear

简单复制我的脚本

但是我不喜欢这个解决方案,因为我希望这个脚本在另一个屏幕(我不知道如何准确地调用它)中执行,就像less一样。通过这种方式,我可以保持终端与脚本调用之前的状态一样。即使他们不接近less行为,任何可以帮助我的建议都是欢迎的。

我在网上搜索我能做什么来复制这个行为,但没有找到任何东西。我开始怀疑这是否可能了。

注意:我不希望'滚动'less行为。我的意思是,如果我就没有问题了使用它,但我并不特别想要它。

我认为您想要运行一个新的终端窗口,并在当前的终端窗口中获得提示符。如果是这样,启动一个新的终端,运行一个带有大量输出的命令,并通过less将其管道化:

xterm -e "ls -lR / | less" &

&在后台运行命令,并在当前终端窗口中获得提示符。

多亏了这些评论,我终于明白了。

据我所知,有两种方法可以使用"光标寻址模式":

  • 使用tput smcup/rmcup
  • 通过进入/退出光标寻址模式手动打印与
  • 相关的转义序列时

此模式是由终端实现的,并不是所有终端都支持-并且并不总是以相同的方式支持,例如,多个终端在进入此模式后不会重置光标位置,因此不要忘记将您的终端设置为clear-但幸运的是,大多数现代终端模拟器都支持。

smcup/rmcup

只需使用tput smcup命令,然后使用tput rmcup恢复。

的例子:

# save, clear screen
tput smcup
clear
# example "application" follows...
read -n1 -p "Press any key to continue..."
# example "application" ends here
# restore
tput rmcup
<<p>来源/em>

转义序列

您可以使用printf \33[?1047h进入此模式,然后使用printf \33[?1047l退出。

的例子:

# save, clear screen
printf \33[?1047h
clear
# example "application" follows...
read -n1 -p "Press any key to continue..."
# example "application" ends here
# restore
printf \33[?1047l

更多信息

尽量避免在同一代码中使用这两个方法,或者使用一个方法进入该模式而使用另一个方法退出该模式,因为这可能导致意外行为。

就我个人而言,我更喜欢tcup方法,因为它更具可读性,并且所有Unix系统都支持。

最新更新