Gnu 화면 - 창 제목 목록 가져오기

Gnu 화면 - 창 제목 목록 가져오기

스크린 세션의 창에 대한 정보(제목, 생성 시간, 표시되는 콘텐츠)를 어떻게 얻을 수 있습니까? 이 작업은 스크립트에서 수행해야 하므로 키 바인딩이나 대화형 명령을 찾지 않습니다.

tmux와 같은 것이 list-windows좋을 것입니다.

답변1

에 따르면이 스레드화면 사용자의 경우 이러한 기능이 화면에 구현되었습니다. 분명히 작동하기에 충분한 최신 버전이 없지만 최신 버전의 화면에서는 작동해야 합니다.[편집하다]방금 최신 git으로 시도했는데 문서에 문서화되어 있지 않아도 작동합니다.screen -h

screen -Q windows
screen -Q select my_window

옵션 이 처음으로 등장한 -Q것은이 커밋.

답변2

Ctrl-a w지침에 따라 순서를 시도해 보세요 .여기.

개인적으로 저는 이 정보를 항상 화면 하단(예: Windows 작업 표시줄)에 유지하는 .screenrc 파일을 사용합니다. 내 화면 구성(~/.screenrc)은 다음과 같습니다.

hardstatus on
hardstatus alwayslastline
hardstatus string "%{.bW}%-w%{.rW}%n %t%{-}%+w %=%{..G} %H %{..Y} %m/%d %C%a "

답변3

GNU 화면에서 모든 창 목록을 가져오고 전환할 창을 선택하는 기본 키 바인딩은 다음과 같습니다.

C-a "

답변4

마침내 나는 그것을 얻었다!

스크립트로 해야 하는데...

소개

창문 5개를 열었다가 닫았어요#2문제가 있는 이름의 파일을 열었습니다.4$ esp32.pdf창문에#3...

screen -Q windows
0$ man screen  1*$ user@host$  3$ pdfread: 4$ esp32.pdf  4-$ root@server#

이 문자열은 거의 사용할 수 없습니다! (자세한 내용은 내더 빠른 기능.)

내 솔루션은 함수로서

일부 창 제목에 다음과 같은 문자열이 포함되어 있는 경우에도 열려 있는 창의 올바른 목록을 검색하고 싶었습니다 ...2*$....

다음은 기존 창 번호 (기본값) 를 검색 0하는 기능입니다 .99

getWinList() {
    if [[ $1 == -v ]]; then
        local -n _outar="$2";shift 2
        else local _outar
    fi
    _outar=()
    local _string _pointer _maxid=${1:-99}
    case $_maxid in
        '' | *[!0-9]* )
            cat <<EOUsage
Usage:
    $FUNCNAME [-v <varname>] [INT]
       -v varname  Populate array "$varname" with window list
       [INT]       Optional last ID to check for existence (default 99)
EOUsage
            return 1
            ;;
    esac
    for ((_pointer=0;_pointer<=_maxid;_pointer++)); do
        _string=$(screen -p $_pointer -Q title) &&
            printf -v _outar[_pointer] %s "$_string"
    done
    printf >&2 '\e[A\n\e[K'
    [[ ${_outar[@]@A} != declare\ -a\ _outar=* ]] ||
        for _pointer in ${!_outar[@]};do
            printf '  %6s: %s\n' "[$_pointer]" "${_outar[_pointer]}"
        done
}

-v옵션을 사용하여 결과를 저장할 수 있습니다 .정렬변수를 선택하고 테스트할 창 수를 선택적으로 추가합니다.

5개의 창을 열고 2번 창을 닫고 3번 창에서 이름이 문제인 파일을 열었습니다...

getWinList
     [0]: man screen
     [1]: user@host$
     [3]: pdfread: Little 4$ esp32.pdf
     [4]: root@server#

getWinList 3
     [0]: man screen
     [1]: user@host$
     [3]: pdfread: 4$ esp32.pdf


getWinList -v array 10                                          
declare  -p array
declare -a array=([0]="man screen" [1]="user@host\$" [3]="pdfread: 4\$ esp32.pdf" [4]="root@server#")

더 빠르지만 안정성이 떨어집니다.

그대로

  • 출력에 따라 screen -Q windows전류에 의해 제한됩니다.창문너비,
  • 기반으로정규식, 이것과 일치하는 모든 창 제목답장결과 배열이 깨질 수 있습니다.
getWinListFast() {
    if [[ $1 == -v ]]; then
        local -n _outar="$2";shift 2
        else local _outar
    fi
    _outar=()
    if [[ $1 ]]; then
            cat <<EOUsage
Usage:
    $FUNCNAME [-v <varname>]
       -v varname  Populate array "$varname" with window list
EOUsage
            return 1
    fi
    . <(screen -Q windows |
            sed '
                :a;
  s/^\(.*\n\|\)\([0-9]\+\)[*!-]*$ \(\([^ ]\| [^ ]\)\+\)\(  \(.*\)\|\) *$/\1[\2]="\3"\n\6/;
                ta;
                s/[|$]/\\&/g;
                s/.*/_outar=(&)\n/')
        printf >&2 '\e[A\n\e[K'
    [[ ${_outar[@]@A} != declare\ -a\ _outar=* ]] ||
        for _pointer in ${!_outar[@]};do
            printf '  %6s: %s\n' "[$_pointer]" "${_outar[_pointer]}"
        done
}

관련 정보