명령 완료 시 분할 화면 영역을 지우지 않음

명령 완료 시 분할 화면 영역을 지우지 않음

일부 명령을 병렬로 실행하고 있으며 모든 명령이 완료된 후 마지막 출력(터미널 에뮬레이터의 스크롤백에서)을 보고 싶습니다. 이것은 내 테스트 스크립트입니다 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쉘 프롬프트가 일부 데이터를 덮어씁니다. 해결책은 echo$LINES번입니다.

답변1

Screen 종료 시 화면이 지워지지 않게 하려면 대체 화면으로 전환되지 않도록 단말기 설명을 선택(또는 수정)해야 합니다. 이것이 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'.

Screen 프로그램에는 일반적으로 꺼지는 대체 화면의 자체 변형도 있습니다.

   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'

관련 정보