这篇 post 居然是在今年 1 月份的时候放到 draft 里,到现在才 publish……
因为用 intel 的编译器,所以设置了 LD_LIBRARY_PATH 这个环境变量,但是每次启动 screen 后这个环境本来都会被 unset。google 到的结果。
screen 可执行文件是 setuid 的(为了 share session,debian 的 screen 安装时默认没有 setuid),glibc 对这样的可执行文件会把那些“危险”的环境变量去掉,所以出现了上面的情况
解决办法两个
1. 把 setuid 位去掉,当然这样 screen 的 share session 就不能工作了,还好一般用不到
2. 把 LD_LIBRARY_PATH 的设置放到 .zshrc/.bashrc 之类的文件里去,这样每次启动 shell 的时候自然会把这个环境变量读入的
if [ -z $LD_LIBRARY_PATH ]; then
export $LD_LIBRARY_PATH=XXX
else
export $LD_LIBRARY_PATH=$LD_LIBRARY_PATH:XXX
fi
LD_LIBRARY_PATH 这个环境变量设置起来还真的挺麻烦的,系统的库目录和自己的库目录下有同名不同版本的库的时候,不是自己的程序有问题就是系统的程序有问题。
screen 提供多个 shell 来回切换是很方便,不过有时会忘记应该切换到哪个 window。如果可以根据执行的命令和当前目录来动态设置 window title 的话来回切换时就会可以方便的找到目标 window。其实 zsh-lovers 里就有说明。
screen 可以通过 echo 特殊的字符来设置 window 的 title,而 zsh 有两个特殊的函数 preexec 和 precmd,前者在用户输入命令按下回车但 zsh 还未执行命令前被调用,后者在 zsh 更新 prompt 前被调用(具体说明见 man zshmisc)。把 zsh 和 screen 的功能结合起来就可以在执行命令时把 screen window 的标题设置成当前执行的命令,而在 zsh 等待用户命令时,将 title 设置成当前目录。
先贴 zsh 的相关配置,PS1 的配置不喜欢可以去掉。
autoload colors
colors
case $TERM in
screen*)
function sctitle() { print -Pn "\ek$1\e\\"}
function precmd() { sctitle "%20< ..<%~%<<" }
function preexec() { sctitle "%20>..>$1%< <" }
export PS1="%{${fg[cyan]}%}[%D{%H:%M} %20<..<%~%<<]%{$reset_color%} "
;;
*)
export PS1="%{${fg[cyan]}%}[%D{%H:%M} %n@%m:%20<..<%~%<<]%{$reset_color%} "
;;
esac
有时命令或者当前目录很长,screen 的 status bar 宽度会不够,zsh 有内置的截短字符串的功能,用 %20< ..<%~%<< 限制目录最长为 20 个字符,把左边的多余字符去掉,截短后用两个点表示,%~ 表示当前目录,如果包含 HOME 目录则用波浪号表示,%<< 标志截短操作的结束。%20>..>$1%< < 类似,preexec 的第一个参数是完整的命令行输入,同样截短成 20 个字符,不过是去掉右边的多余字符。sctitle 就是打印特殊字符来设置 screen window title 的函数。
接下来是 .screenrc。
startup_message off
# use visual bell
vbell off
# replace Ctrl-A by `
escape ``
# set a big scrolling buffer
defscrollback 5000
# Set the caption on the bottom line
caption always '%{= kg}[%{G}%H%{g}][%= %{= kw}%?%-Lw%?%{+b r}(%{y}%n %t%?(%u)%?%{r})%{= w}%?%+Lw%?%?%= %{g}][%{B} %d/%m %{W}%c %{g}]'
# %{= kG} first set default color (=), back ground black (k), foreground green (G)
# [%{G}%H%{g}] color bright green, host name (%H), color green
# [%= ...] padding (%=), window left to the current focus window if exists,
# (current focus window with color yellow), window to the right of the
# focus window
# [%{B} %m/%d %{W}%c %{g}] color bright blue, month/date (%m%d), color bright white,
# current time(%c), color green
# open several terminals at startup
screen 5
screen 4
screen 3
screen 2
screen 1
因为我用 vim,而且我觉得切换 window 时要按数字键,所以我把 escape 设置成 back tick。这个配置最关键的就是 caption 了,忘记从哪里 copy 过来的了(用 hardstatus 的话 screen 的消息也是在 hardstatus 上显示,所以我喜欢用 caption)。我直接在配置文件里加了点注释,语法很恶心,我都看晕了。关于 caption/hardstatus 里的转义字符说明见 man screen 的 string escape 一节。
试试看吧,这个配置还是很炫而且也蛮实用的。
Recent Comments