pantalla gnu - obtener lista de títulos de ventanas

pantalla gnu - obtener lista de títulos de ventanas

¿Cómo puedo obtener información (título, hora de creación, contenido visible) sobre las ventanas en una sesión de pantalla? Necesito hacer esto en un script, por lo que no busco combinaciones de teclas ni comandos interactivos.

Algo como el de tmux list-windowssería genial.

Respuesta1

De acuerdo aeste hiloEn los usuarios de pantalla, dicha funcionalidad se ha implementado en la pantalla. Aparentemente no tengo una versión lo suficientemente reciente para que funcione, pero debería funcionar en versiones recientes de la pantalla.[Editar]Lo intenté con el último git, funciona incluso si no está documentado enscreen -h

screen -Q windows
screen -Q select my_window

La primera aparición de la -Qopción fue eneste compromiso.

Respuesta2

Pruebe la secuencia Ctrl-a wsegún las instrucciones.aquí.

Personalmente, uso un archivo .screenrc que mantiene esta información en la parte inferior de la pantalla en todo momento (como una barra de tareas de Windows). Mi configuración de pantalla (~/.screenrc) se ve así:

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

Respuesta3

En GNU Screen, la combinación de teclas predeterminada para obtener una lista de todas las ventanas (y elegir una para cambiar) es:

C-a "

Respuesta4

¡Finalmente lo tengo!

Necesito hacer esto en un script...

Introducción

He abierto 5 ventanas, ventana cerrada#2y abrí un archivo con un nombre problemático4$ esp32.pdfen la ventana#3...

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

¡Esta cuerda está casi inutilizable! (Ver más, mifunción más rápida.)

Mi solución, como función.

Quería recuperar una lista correcta de ventanas abiertas, incluso si el título de alguna ventana contiene cadenas como ...2*$...estas:

Aquí hay una función que busca el número de ventana existente, desde 0hasta 99(de forma predeterminada).

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
}

Podrías usar -vla opción para almacenar el resultado en unformaciónvariable y agregue un número opcional de ventana para probar:

Abrí 5 ventanas, cerré la ventana n.° 2 y abrí un archivo con un nombre problemático en la ventana 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#")

Más rápido pero menos confiable:

Como están las cosas

  • basado en la salida del screen -Q windowsmismo está limitado por la corrienteventanaancho,
  • Residencia enexpresión regular, cualquier título de ventana que coincida con esterepodría romper la matriz resultante.
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
}

información relacionada