Gnu-Screen

一個命令完成時不清除分屏區域

  • October 21, 2017

我並行執行一些命令,我​​想在所有命令完成後查看它們的最後輸出(在我的終端模擬器的回滾中)。這是我的測試腳本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 次。

清除分屏區域沒有好的解決方案:殭屍視窗阻止螢幕退出。我必須在視窗和呼叫者腳本之間添加額外的同步,當它們都死掉時,我會screen -X quit顯式呼叫。

altscreen命令與此無關。游標沒有移動到底部,因為我的預設設置/etc/screenrc是半工作:使用了主機終端 altscreen 功能,但在切換回來之前沒有清除 altscreen。為了使其預設工作,我/etc/screenrc從複製CentOS 7並在我的情況下完全禁用了該功能termcapinfo * ti=:te=

test.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'

如果您不想在退出“螢幕”時清除螢幕,您應該選擇(或修改)不切換到備用螢幕的終端描述。那就是外面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'. 

進一步閱讀:

引用自:https://unix.stackexchange.com/questions/398093