我并行运行一些命令,我想在所有命令完成后看到它们的最后输出(在终端模拟器的回滚中)。这是我的测试脚本test.screen
:
#
screen -t A sh -c 'echo important info && sleep 2'
split
focus
#
screen -t B sh -c 'echo another important info && sleep 5'
启动命令:
$ screen -c test.screen
输出:
[screen is terminating]
[il@reallin ~]$
--
another important info
1 B
一个问题是:当第一个sleep 2
完成时,打印的消息important info
被删除。如果我zombie kr
在开头添加,那么屏幕根本不会退出。作为解决方法,调用者可以等待所有屏幕进程退出,然后发出-X quit
另一个问题:退出时插入符号不会移动到底部screen
,并且 shell 提示符会覆盖一些数据。解决方法是echo
$LINES 次。
答案1
如果您不希望退出“屏幕”时清除屏幕,则应选择(或修改)不切换到备用屏幕的终端描述。这就是TERM
价值外部 screen
。
使用 xterm(以及 PuTTY 等其他一些),您可以配置终端以防止使用备用屏幕,但对于大多数复制 xterm 备用屏幕功能的终端,这是硬编码的,不可配置。所以终端描述是开始的地方。
ncurses 提供了一个终端描述“xterm1”,它抑制了备用屏幕(并且看到它在 Debian 中,它可能在派生发行版中,例如 Ubuntu)。对于其他系统,这取决于。这是与 infocmp 的区别:
comparing xterm1 to xterm.
comparing booleans.
comparing numbers.
comparing strings.
rmcup: NULL, '\E[?1049l'.
smcup: NULL, '\E[?1049h'.
“屏幕”程序也有其自己的备用屏幕变体,该屏幕通常处于关闭状态:
altscreen on|off
If set to on, "alternate screen" support is enabled in virtual termi‐
nals, just like in xterm. Initial setting is `off'.
进一步阅读:
答案2
对于被清除的分屏区域没有好的解决方案:僵尸窗口阻止屏幕退出。我必须在窗口和调用者脚本之间添加额外的同步,当它们全部消失时,我会screen -X quit
显式调用。
该altscreen
命令与此无关。光标没有移动到底部,因为我的默认设置/etc/screenrc
是半工作的:使用了主机终端 altscreen 功能,但在切换回来之前 altscreen 没有被清除。为了使其在默认情况下工作,我/etc/screenrc
从复制CentOS 7
并针对我的情况,我完全禁用了该功能termcapinfo * ti=:te=
。
测试.sh:
#!/bin/bash
# set -e
if [ "a" = "$1" ]; then
# decrement file name towards zero, then kill screen
set -e
a=-1
cd "$COUNTERDIR"
while true; do
for old in *; do
new=$((old + a))
done
[ 0 -eq "$a" ] || 2>/dev/null mv ./$old ./$new && break
done
if [ 0 -eq "$new" ]; then
screen -X quit
fi
exit
fi
NWINDOWS=2
COUNTERDIR=`mktemp -d`
touch "$COUNTERDIR/$NWINDOWS"
export COUNTERDIR
screen -c test.screen
rm -rf "$COUNTERDIR"
测试屏幕:
# do not use host terminal altscreen feature
termcapinfo * ti=:te=
# windows stay after command terminates
zombie kr
screen -t A sh -c 'for ((i=0; i<100; i++)); do echo important info $i; done && sleep 5; ./test.sh a'
split
focus
screen -t B sh -c 'for ((i=0; i<100; i++)); do echo another important info $i; done && sleep 2; ./test.sh a'