我尝试制作一个简单的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系统都支持。