GNU Screen - Liste der Fenstertitel abrufen

GNU Screen - Liste der Fenstertitel abrufen

Wie kann ich Informationen (Titel, Erstellungszeit, sichtbarer Inhalt) über Fenster in einer Bildschirmsitzung erhalten? Ich muss dies in einem Skript tun, daher suche ich nicht nach Tastenkombinationen oder interaktiven Befehlen.

So etwas wie tmux list-windowswäre toll.

Antwort1

Entsprechenddieser ThreadIn Screen-Usern wurde eine solche Funktionalität in Screen implementiert. Anscheinend habe ich keine aktuelle genug Version, damit es funktioniert, aber dies sollte in neueren Versionen von Screen funktionieren.[Bearbeiten]Ich habe es gerade mit dem neuesten Git versucht, es funktioniert, auch wenn es nicht dokumentiert ist inscreen -h

screen -Q windows
screen -Q select my_window

Das erste Mal erschien die -QOption indieses Commit.

Antwort2

Probieren Sie die Reihenfolge Ctrl-a wgemäß den Anweisungen ausHier.

Ich persönlich verwende eine .screenrc-Datei, die diese Informationen immer am unteren Bildschirmrand anzeigt (wie eine Windows-Taskleiste). Meine Bildschirmkonfiguration (~/.screenrc) sieht folgendermaßen aus:

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

Antwort3

In GNU Screen lautet die Standardtastenkombination zum Anzeigen einer Liste aller Fenster (und zum Auswählen eines Fensters zum Wechseln):

C-a "

Antwort4

Endlich hab ich es!

Ich muss dies in einem Skript tun ...

Einführung

Ich habe 5 Fenster geöffnet, Fenster geschlossen#2und öffnete eine Datei mit einem problematischen Namen4$ esp32.pdfim Fenster#3...

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

Diese Saite ist nahezu unbrauchbar! (Siehe weiter unten, meineschnellere Funktion.)

Meine Lösung als Funktion

Wollte eine korrekte Liste der geöffneten Fenster abrufen, auch wenn einige Fenstertitel Zeichenfolgen wie ...2*$...diese enthalten:

Hier ist eine Funktion, die nach vorhandenen Fensternummern sucht, von 0bis 99(standardmäßig).

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
}

Sie können -vdie Option zum Speichern des Ergebnisses in einemAnordnungVariable und fügen Sie eine optionale Anzahl von zu testenden Fenstern hinzu:

Ich habe 5 Fenster geöffnet, Fenster Nr. 2 geschlossen und in Fenster 3 eine Datei mit einem problematischen Namen geöffnet ...

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#")

Schneller, aber weniger zuverlässig:

Wie es ist

  • basierend auf der Leistung screen -Q windowsist es durch den Strom begrenztFensterBreite,
  • bezogen aufregulären Ausdruck, jeder Fenstertitel, der diesem entsprichtRekönnte das resultierende Array beschädigen.
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
}

verwandte Informationen