
我希望在一個膩子視窗中進行一些虛擬會話,並在它們之間快速進行更改。最好的方法是什麼?screen
?我知道我可以分開ctrl+ad
然後重新連接到另一個會話,但這似乎需要大量打字。
答案1
只是為了擴展 Ansgar 所說的內容,以防您不太熟悉 gnu screen,在單一螢幕會話中擁有多個「視窗」可能會滿足您的需求。
ctrl+ a,c將在活動螢幕會話中建立新的「視窗」。您可以在多個窗口之間切換(如 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+ a,n將帶您到下一個窗口,Ctrl+ a,p到上一個窗口。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
假設您打開的螢幕很少。我們還假設您將它們分類為工作和數據。
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; ...
申請後
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.
現在讓我們使用 隔離分離的螢幕
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)
現在讓我們再次使用 來選擇您想要的(例如資料)
grep
。screen -ls | grep Detached | grep data
這將僅隔離資料螢幕。您可以使用正規表示式變更 grep 關鍵字進行搜尋以自訂您的搜尋。
81592.data13 (Detached)
81586.data12 (Detached)
81574.data10 (Detached)
81580.data11 (Detached)
幸運的是,結果結構良好且以製表符分隔。現在讓我們將列拆分為欄位並使用 選擇第二個欄位
cut
。screen -ls | grep Detached | grep data | cut -d' ' -f2
您需要按 Tab 鍵在分隔符號參數後面ctrl+v
插入一個。結果應該是這樣的。tab
-d
81592.data13
81586.data12
81574.data10
81580.data11
現在使用引號將其打包到命令中
...
,並像這樣循環結果。在實際運行之前,請務必先檢查制定的命令。我用了echo screen -r
for s in `screen -ls | \ grep Detached | grep data | \ cut -d' ' -f2`; do \ echo screen -r $s; \ done
如果一切順利,那麼嘗試不使用
echo
.for s in `screen -ls | \ grep Detached | grep data | \ cut -d' ' -f2`; do \ screen -r $s; \ done
瞧。您脫離的每個螢幕都會帶您進入下一個畫面。
快樂放映!