4

我已经尝试了一堆命令,但它们都将会话附加到当前会话中,正如您可以想象的那样,当我稍后尝试重新附加它时它会保释,因为它已经附加在会话嵌套中。

我为我使用 Windows 处理的每个项目创建会话到远程服务器、日志和 vim。但是每次我想切换时,我都必须先 Ca d 然后 screen -DR

我宁愿只输入一个命令。

谢谢

4

2 回答 2

2

AFAIK 这是不可能的screen,我知道没有办法轻松解决这个限制。这里的问题是每个screen会话都是独立的,并且不知道其他会话。

如果这是您经常使用的功能,我建议您切换到tmux使用<C-b>s. 在过去的一年中,每当需要终端多路复用器时,我都广泛使用了这两种方法screentmux并且不后悔偏爱。tmux

附带说明一下,运行嵌套屏幕会话并不太难,只需发送两个转义符和命令进入内部屏幕会话,如果转义符是单个字符,它会有所帮助,我喜欢:

escape ``
于 2012-07-27T00:41:59.670 回答
0

为此有一个 bash 脚本,https://github.com/scottxhe/switch-screen-session使用循环和命名管道,它干净且易于设置和使用。我是作者。这是主要的 bash 功能。把它放在一个脚本中并获取它。ss应该是可调用的。

ss my-session-name从屏幕内部或外部。my-session-name可以是新的或现有的会话。如果您对其他细节感兴趣,请查看 github。

ss() {
    if [ -z $1 ]; then
        screen -ls
        return 0
    fi

    next_session=$1
    prev_session=$1

    if [ -z "$STY" ]; then

        if [ ! -e ~/.next_s ]; then
            mkfifo ~/.next_s
        fi

        if [ ! -e ~/.prev_s ]; then
            mkfifo ~/.prev_s
        fi

        (
            echo $next_session > ~/.next_s &
            echo $prev_session > ~/.prev_s &
        )

        while true; do
            next="$(cat ~/.next_s)"
            prev="$(cat ~/.prev_s)"

            if [ -z "$next" ] && [ -z "$prev" ]; then
                return 0
            elif grep -q "^~" <<< "$prev"; then
                next_session=$prev_session
                prev_session="$(sed s/~// <<<"$prev" | grep -v "^$")"
            else
                prev_session=$prev
                next_session=$(grep -v "^$" <<< "$next")
            fi

            screen -dR $next_session

            (
                echo '' > ~/.next_s &
                echo '' > ~/.prev_s &
            )
        done
    else
        (
            echo $next_session > ~/.next_s &
            echo $STY > ~/.prev_s &
        )

        screen -d $STY
    fi
}
于 2021-12-05T19:42:02.247 回答