gnu screen-获取窗口标题列表

gnu screen-获取窗口标题列表

如何获取有关屏幕会话中的窗口的信息(标题、创建时间、可见内容)?我需要在脚本中执行此操作,因此我不需要寻找键绑定或交互式命令。

像 tmux 这样的东西list-windows就很棒了。

答案1

根据此主题在 screen-users 中,screen 中已经实现了这样的功能。显然,我的版本不够新,无法使用此功能,但这应该在较新版本的 screen 中可用。[编辑]我刚刚尝试使用最新的 git,即使没有记录,它也可以工作screen -h

screen -Q windows
screen -Q select my_window

该选项首次出现-Q这次提交

答案2

Ctrl-a w按照说明尝试序列这里

就我个人而言,我使用 .screenrc 文件,该文件始终将这些信息保存在屏幕底部(如 Windows 任务栏)。我的屏幕配置 (~/.screenrc) 如下所示:

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

答案3

在 GNU Screen 中,获取所有窗口列表(并选择一个进行切换)的默认键绑定是:

C-a "

答案4

最后我得到了它!

我需要在脚本中执行此操作...

介绍

我打开了 5 扇窗户,关闭了一扇#2并打开了一个名称有问题的文件4$ esp32.pdf在窗口中#3...

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

这根弦几乎不能用了!(进一步了解,我的更快的功能

我的解决方案是作为一个函数

想要检索打开的窗口的正确列表,即使某些窗口标题包含如下字符串...2*$...

这是一个搜索现有窗口编号的函数,从099(默认)。

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
}

您可以使用-v选项将结果存储到大批变量并添加可选的窗口数量来测试:

我打开了 5 个窗口,关闭了窗口 #2,并在窗口 #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#")

更快但不太可靠:

事实

  • 根据screen -Q windows其输出受到电流限制窗户宽度,
  • 基于正则表达式,任何与此匹配的窗口标题关于可能会破坏随后产生的数组。
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
}

相关内容