.screenrc 中的屏幕布局操作不起作用

.screenrc 中的屏幕布局操作不起作用

我已经使用screen(v4.03.01)有一段时间了并且非常喜欢它。我已经大量定制了我的.screenrc,但是由于某些奇怪的原因,布局命令在启动时不执行。如果我这样做source ~/.screenrc,他们就会接受,并且我的布局会更改为我想要的。值得注意的是,我启动屏幕时的 a与它所属的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

答案1

您发现了一个错误。那是一件令人讨厌的事情。

命令系列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:layout prev),屏幕会陷入无限循环。

此外,由于screen我系统上的二进制文件是 SUID root(我需要多用户支持),因此错误变得更严重。一旦用户进程被终止,根进程就会开始无限循环并最终崩溃。 SUID 进程崩溃的可能性,甚至只是创建多个根进程在无限循环中吸收 CPU 资源的能力,都是非常危险的。

我已经在您的 screen 版本(4.3.0)和 4.5.0(最新版本)上进行了测试,该错误仍然存​​在。我正在编译源代码并向-DDEBUGscreen 开发团队报告错误。屏幕-DDEBUG出现故障并显示:

ASSERT(l->l_cvlist != cv) failed file canvas.c line 294

因此,无限循环很可能会尝试在该链表中查找某些内容,但一次又一次失败。

黑客解决方法

屏幕允许您使用bindeval方法。因此,您可以添加.screenrc以下内容:

bind g eval 'layout new default' 'split -v' 'resize 60%' 'split -h' 'layout select default'

黑客的部分是它必须在单行上,屏幕没有任何方法来转义.screenrc.然后,在进入屏幕 ( Ctrl+ ag) 后,您可以通过一次(也可以是两次)击键来获得布局。

g通常与系统铃声绑定,因此您不应错过它。但您可以绑定任何您喜欢的键。

相关内容