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-windows
wä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 -Q
Option indieses Commit.
Antwort2
Probieren Sie die Reihenfolge Ctrl-a w
gemäß 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
#2
und öffnete eine Datei mit einem problematischen Namen4$ esp32.pdf
im 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 0
bis 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 -v
die 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 windows
ist 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
}