gnu screen - 取得視窗標題列表

gnu screen - 取得視窗標題列表

如何取得螢幕會話中視窗的資訊(標題、建立時間、可見內容)?我需要在腳本中執行此操作,因此我不需要尋找按鍵綁定或互動式命令。

像 tmux 這樣的東西list-windows會很棒。

答案1

根據這個線程在 screen-users 中,這樣的功能已在 screen 中實現。顯然我沒有足夠新的版本來讓它工作,但這應該在最新版本的螢幕上工作。[編輯]我剛剛嘗試使用最新的 git,即使它沒有記錄在其中它也可以工作screen -h

screen -Q windows
screen -Q select my_window

該選項首次出現-Q這次提交

答案2

Ctrl-a w按照說明嘗試順序這裡

就我個人而言,我使用 .screenrc 檔案來始終將此資訊保留在螢幕底部(如 Windows 工作列)。我的螢幕配置(~/.screenrc)如下所示:

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

答案3

在 GNU Screen 中,取得所有視窗清單(並選擇要切換到的視窗)的預設鍵綁定是:

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*$...這樣的字串:

這是一個搜尋現有視窗號的函數,從099(預設)。

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
}

相關內容