¿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-windows
serí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 -Q
opción fue eneste compromiso.
Respuesta2
Pruebe la secuencia Ctrl-a w
segú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
#2
y abrí un archivo con un nombre problemático4$ esp32.pdf
en 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 0
hasta 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 -v
la 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 windows
mismo 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
}