当一个命令完成时不清除分屏区域

当一个命令完成时不清除分屏区域

我并行运行一些命令,我​​想在所有命令完成后看到它们的最后输出(在终端模拟器的回滚中)。这是我的测试脚本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'

相关内容