.screenrc 中的螢幕佈局操作不起作用
我已經使用
screen
(v4.03.01) 一段時間了,真的很喜歡它。我已經對我.screenrc
的 . 如果我source ~/.screenrc
,他們會接受並且我的佈局會更改為我想要的。值得注意的是,我以與所屬crontab @reboot
使用者相同的使用者開始螢幕。.screenrc
為什麼會發生這種情況,我該如何解決?
這是我的
.screenrc
:startup_message off altscreen on bell_msg "Window % wants your attention!^G" vbell off sorendition "= KW" caption string "%{KW}" defscrollback 5000 # backtick 0: get cpu usage backtick 0 0 0 sh $HOME/.screenrc.cpu # backtick 1: get ram usage backtick 1 1 1 $HOME/.screenrc.ram hardstatus alwayslastline hardstatus string "%{= Kk}[ %{= KW}%H%{-} ] CPU: %{= KW}%0` %{-}RAM: %{= KW}%1` %{-}< %L=%-w%40L>%{= wk}%n %t%{-}%+w%-21= > [ %{= KW}%0c%{-} | %{= KW}%0d %M%{-} ]" # %{= Kk} : set colors to black on bright black # [ : literal # %{= KW} : set colors to bright white on bright black # %H : hostname # %{-} : reset colors to previous (black on bright black) # ] CPU: : literal # %{= KW} : set colors to bright white on bright black # %0` : execute backtick 0: cpu usage # %{-} : reset colors to previous (black on bright black) # RAM: : literal # %{= KW} : set colors to bright white on bright black # %1` : execute backtick 1: ram usage # %{-} : reset colors to previous (black on bright black) # < : literal # %L= : padding anchor: prevents truncation of previous # %-w : previous windows # %40L> : padding anchor: next element is at 40% of the space between previous and next anchors # %{= wk} : set colors to black on white # %n : window number # %t : window title # %{-} : reset colors to previous (black on bright black) # %+w : next windows # %-21= : padding anchor: next character is 21 characters from the right of the screen # > [ : literal # %{= KW} : set colors to bright white on bright black # %c : time (24h) # %{-} : reset colors to previous (black on bright black) # | : literal # %{= KW} : set colors to bright white on bright black # %d : day of month # %M : three-letter month # %{-} : reset colors to previous (black on bright black) # ] : literal # bind function keys (f1-f10) to window bindkey "^[OP" select 0 bindkey "^[OQ" select 1 bindkey "^[OR" select 2 bindkey "^[OS" select 3 bindkey "^[[15~" select 4 bindkey "^[[17~" select 5 bindkey "^[[18~" select 6 bindkey "^[[19~" select 7 bindkey "^[[20~" select 8 bindkey "^[[21~" select 9 bindkey "^[[1;5D" prev # ctrl-left to switch to previous window bindkey "^[[1;5C" next # ctrl-right to switch to next window bindkey "^[[1;5B" focus # ctrl-down to switch to next region bind = resize +1 #ctrl-= to embiggen region bind - resize -1 #ctrl-- to shrink region screen -t shell 0 bash screen -t shell 1 bash screen -t shell 2 bash screen -t shell 3 bash screen -t shell 4 bash screen -t shell 5 bash screen -t root 6 su - screen -t something1 7 bash screen -t something2 8 bash screen -t something3 9 bash #layout stuff layout new default layout autosave on split -v resize 60% split -h resize 15% select 7 focus down select 0 focus right split -h select 8 focus down select 9 focus left focus up layout save default layout attach default layout select default
你發現了一個錯誤。還有一個討厭的。
layout
命令系列似乎依賴於控制終端(必須存在 TTY 或 PTS 才能使命令工作)。我可以在不經歷的情況下複製問題crontab
:我將以下內容附加到我的
.screenrc
:layout new lay1 split -v layout new lay2 split -v layout attach lay2
直接執行
screen
讓我得到佈局:screen
但是執行以下操作無法找到佈局:
screen -dm && screen -r
在最後一個命令中,我仍然可以使用 列出佈局
:layout show
,但是該死的,現在是錯誤變得令人討厭的時候了。如果我嘗試更改佈局(使用:layout next
or:layout prev
),螢幕會陷入無限循環。此外,由於
screen
我係統上的二進製文件是 SUID root(我需要多使用者支持),因此錯誤變得更糟。一旦使用者程序被殺死,根程序就會開始無限循環並最終崩潰。使 SUID 程序崩潰的可能性,或者甚至只是創建多個根程序以無限循環吸取 CPU 資源的能力,都是非常危險的。我已經在您的螢幕版本(4.3.0)以及仍然存在錯誤的 4.5.0(最新版本)上對其進行了測試。我正在編譯原始碼
-DDEBUG
並將錯誤報告給 screen 的開發團隊。-DDEBUG
螢幕失敗並顯示:ASSERT(l->l_cvlist != cv) failed file canvas.c line 294
因此,無限循環很可能會嘗試在該鍊錶中查找某些內容並一遍又一遍地失敗。
黑客解決方法
螢幕允許您使用
bind
該eval
方法。因此,您可以添加以下內容.screenrc
:bind g eval 'layout new default' 'split -v' 'resize 60%' 'split -h' 'layout select default'
駭人聽聞的部分是它必須在單行上,螢幕沒有任何方法可以在
.screenrc
. 然後,您可以在進入螢幕 (Ctrl
+a``g
) 後通過單次(以及雙次)擊鍵獲得您的佈局。
g
通常綁定到系統鈴,所以你不應該錯過它。但是你可以綁定任何你喜歡的鍵。