Como posso obter informações (título, horário de criação, conteúdo visível) sobre janelas em uma sessão de tela? Preciso fazer isso em um script, por isso não estou procurando atalhos de teclado ou comandos interativos.
Algo como o do tmux list-windows
seria ótimo.
Responder1
De acordo comeste tópicoem usuários de tela tal funcionalidade foi implementada em tela. Aparentemente não tenho uma versão recente o suficiente para funcionar, mas deve funcionar em versões recentes da tela.[Editar]Eu apenas tentei com o git mais recente, funciona mesmo que não esteja documentado emscreen -h
screen -Q windows
screen -Q select my_window
A primeira aparição da -Q
opção foi emeste commit.
Responder2
Experimente a sequência Ctrl-a w
de acordo com as instruçõesaqui.
Pessoalmente, eu uso um arquivo .screenrc que mantém essas informações sempre na parte inferior da tela (como uma barra de tarefas do Windows). Minha configuração de tela (~/.screenrc) se parece com:
hardstatus on
hardstatus alwayslastline
hardstatus string "%{.bW}%-w%{.rW}%n %t%{-}%+w %=%{..G} %H %{..Y} %m/%d %C%a "
Responder3
No GNU Screen, a ligação de tecla padrão para obter uma lista de todas as janelas (e escolher uma para alternar) é:
C-a "
Responder4
Finalmente consegui!
Eu preciso fazer isso em um script ...
Introdução
Eu abri 5 janelas, fechei a janela
#2
e abriu um arquivo com um nome problemático4$ esp32.pdf
na janela#3
...
screen -Q windows
0$ man screen 1*$ user@host$ 3$ pdfread: 4$ esp32.pdf 4-$ root@server#
Esta string está quase inutilizável! (Veja mais, meufunção mais rápida.)
Minha solução, como uma função
Queria recuperar uma lista correta de janelas abertas, mesmo que alguns títulos de janelas contenham strings como ...2*$...
ou algo assim:
Aqui está uma função que procura o número da janela existente, de 0
até 99
(por padrão).
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
}
Você poderia usar -v
a opção para armazenar o resultado em umvariedadevariável e adicione um número opcional de janela para testar:
Abri 5 janelas, fechei a janela 2 e abri um arquivo com nome problemático na janela 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#")
Mais rápido, mas menos confiável:
Como isso é
- com base na saída dele
screen -Q windows
é limitado pela correntejanelalargura, - baseado emexpressão regular, qualquer título de janela correspondente a esterépoderia quebrar a 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
}