在虛擬會話之間快速切換(螢幕?)

在虛擬會話之間快速切換(螢幕?)

我希望在一個膩子視窗中進行一些虛擬會話,並在它們之間快速進行更改。最好的方法是什麼?screen?我知道我可以分開ctrl+ad然後重新連接到另一個會話,但這似乎需要大量打字。

答案1

只是為了擴展 Ansgar 所說的內容,以防您不太熟悉 gnu screen,在單一螢幕會話中擁有多個「視窗」可能會滿足您的需求。

ctrl+ ac將在活動螢幕會話中建立新的「視窗」。您可以在多個窗口之間切換(如 Ansgar 所示),使用ctrl+表示下一個窗口,使用+表示上一個窗口。anctrlap

ctrl+ a"將為您提供所有打開的視窗的清單。

使用這些簡單的快捷方式將讓您非常快速、輕鬆地在不同終端之間切換,無需使用多個螢幕會話即可實現您的目標。

如果您將以下行新增至 ~/.screenrc 中,它將始終顯示您開啟的視窗以及選擇了哪個窗口,因此您無需透過記住來追蹤您所在的視窗。

hardstatus alwayslastline '%{= kg}[ %{G}%H %{g}][%= %{= kB}%?%-Lw%?%{+b r}(%{G}%n*%f %t%?(%u)%?%{r})%{-b B}%?%+Lw%?%?%= %{g}%]'

這是我喜歡使用的 Hardstatus 行,但它是完全可自訂的(請參閱手冊頁或在 google 中搜尋“gnu screen Hardstatus”)。

您可以用它做很多其他事情(例如,命名不同的開啟視窗),因此值得閱讀一些教學。

以下是我透過快速搜尋找到的幾個:

http://news.softpedia.com/news/GNU-Screen-Tutorial-44274.shtml

http://www.ibm.com/developerworks/aix/library/au-gnu_screen/

當然,最有用的是:

# From your terminal:
$ man screen

希望有幫助。

馬修

答案2

是的,screen這很可能是可行的方法。Ctrl+ an將帶您到下一個窗口,Ctrl+ ap到上一個窗口。Ctrl+ a, 0..9將允許您切換到特定螢幕。

答案3

經過這麼長時間,我編寫了一個腳本來解決這個完全缺少的功能。首先它需要一個fifo:

mkdir ~/.screen
mkfifo ~/.screen/pipe

此命名管道對於分離會話和「Main-without-screen」會話之間的通訊非常有用。

文件SC(在 $PATH 中):

#!/bin/bash
CONFIGFILE=~/.screen/"$1""rc"

if [ ! -r $CONFIGFILE ] ; then
   echo "Configurazione per $1 Assente" >&2
   exit 1
fi

exec 3<> ~/.screen/pipe

if [ "$STY" != "" ] ; then
   screen -d "$STY"
   echo "$1" >&3
else
   screen -r "$1" 2>/dev/null || screen -S "$1" -c $CONFIGFILE
   while true ; do
      read line <&3
      screen -r "$line" 2>/dev/null || screen -S "$line" -c ~/.screen/"$line""rc"
   done
fi

「CONFIGFILE」的範例是:~/.screen/Monitorrc

layout new Monitor

screen -t "bash" bash --login
split -v
focus next
split 
focus bottom
screen -t "cv" sh -c "watch /usr/bin/cv -w"
split
focus bottom
screen -t "sys.log" sh -c "tail -F /var/log/sys.log"
focus up
focus up
resize 25
screen -t "top" sh -c "top"
focus left

結果是:當您想要啟動螢幕時,輸入:

sc Monitor

或者你喜歡發明的另一個 sessionrc,我使用 Session Work 來處理各種事情

例如:~/.screen/Workrc

layout new Work  
screen -t "bash" bash --login  

現在我們在會話監視器中,輸入:

sc Work

會話監視器自行分離並將“Work”寫入命名管道。因此,第一個 sc 腳本繼續並附加會話「工作」。
sc 從會話監視器呼叫關閉。

當我們分離所有會話時,我們處於無限循環中,因此我們必須執行 Ctrl-c 才能退出。

答案4

您可以使用簡單的 shell 腳本來完成此操作,例如

    for s in `screen -ls | grep Detached | grep <regex to your screen names>`; do screen -r $s; done 
  1. 假設您打開的螢幕很少。我們還假設您將它們分類為工作和數據。

    for i in {10..13}; do screen -S `printf data%02d $i`; done;
    for i in {0..5}; do screen -S `printf work%02d $i`; done;
    ...
    
  2. 申請後screen -ls,你的螢幕應該是這樣的

    There are screens on:
        81592.data13    (Detached)
        81539.work04    (Detached)
        81527.work02    (Detached)
        81586.data12    (Detached)
        81574.data10    (Detached)
        81533.work03    (Detached)
        81488.work00    (Detached)
        81607.ttys014.Mo    (Attached)
        81545.work05    (Detached)
        81580.data11    (Detached)
        81521.work01    (Detached)
        81515.work00    (Detached)
    12 Sockets in /var/folders/qs/cvlbhpr54fnb96vtx01bs9k00000gn/T/.screen.
    
  3. 現在讓我們使用 隔離分離的螢幕grep

    screen -ls | grep Detached
    

你應該得到這樣的東西

        81592.data13    (Detached)
        81539.work04    (Detached)
        81527.work02    (Detached)
        81586.data12    (Detached)
        81574.data10    (Detached)
        81533.work03    (Detached)
        81488.work00    (Detached)
        81545.work05    (Detached)
        81580.data11    (Detached)
        81521.work01    (Detached)
        81515.work00    (Detached)
  1. 現在讓我們再次使用 來選擇您想要的(例如資料)grep

    screen -ls | grep Detached | grep data
    

這將僅隔離資料螢幕。您可以使用正規表示式變更 grep 關鍵字進行搜尋以自訂您的搜尋。

        81592.data13    (Detached)
        81586.data12    (Detached)
        81574.data10    (Detached)
        81580.data11    (Detached)
  1. 幸運的是,結果結構良好且以製表符分隔。現在讓我們將列拆分為欄位並使用 選擇第二個欄位cut

    screen -ls | grep Detached | grep data | cut -d'       ' -f2
    

您需要按 Tab 鍵在分隔符號參數後面ctrl+v插入一個。結果應該是這樣的。tab-d

81592.data13
81586.data12
81574.data10
81580.data11
  1. 現在使用引號將其打包到命令中...,並像這樣循環結果。在實際運行之前,請務必先檢查制定的命令。我用了echo screen -r

    for s in `screen -ls | \
    grep Detached | grep data | \
    cut -d'     ' -f2`; do \
        echo screen -r $s; \
    done
    
  2. 如果一切順利,那麼嘗試不使用echo.

    for s in `screen -ls | \
    grep Detached | grep data | \
    cut -d'     ' -f2`; do \
        screen -r $s; \
    done
    
  3. 瞧。您脫離的每個螢幕都會帶您進入下一個畫面。

快樂放映!

相關內容