gnu screen - ウィンドウタイトルのリストを取得する

gnu screen - ウィンドウタイトルのリストを取得する

画面セッション内のウィンドウに関する情報 (タイトル、作成時間、表示されるコンテンツ) を取得するにはどうすればよいですか? これをスクリプトで実行する必要があるため、キー バインディングや対話型コマンドは必要ありません。

tmux のようなものがlist-windows素晴らしいでしょう。

答え1

によるとこのスレッドscreen-users では、そのような機能が screen に実装されています。どうやら、これが機能するには私のバージョンが十分新しいものではないようですが、これは 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 では、すべてのウィンドウのリストを取得して (切り替えるウィンドウを 1 つ選択する) ためのデフォルトのキー バインディングは次のとおりです。

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
}

関連情報