今儿回家突然发现休眠后zsh无法启动了,便研究了一下,顺便解决了我另外的一个问题,特此记录。
事情的起因呢,是我在公司使用sshfs挂载了另一台主机的一个目录,下班的时候,zsh还在那个目录中,我就给休眠带回家了。
这回家一开机,当然目录肯定就不能访问了,但是我的zsh也起不来了,各种起不来:tmux里面开新标签;konsole直接带参数启动;bash里面启动zsh等等,均以失败告终。
这就神奇了,用这么就才发现zsh还有这种bug?休眠后会起不来?不应该啊
话说前两天刚用过strace,这玩意儿还挺好用,跑一下咯
命令如下:
strace /usr/bin/zsh
输出如下:(这个是正常输出,现场已经没有了:D)
stat("/home/xxxx/.zdirs", {st_mode=S_IFREG|0644, st_size=452, ...}) = 0
rt_sigprocmask(SIG_BLOCK, [CHLD], [CHLD WINCH], 8) = 0
open("/home/xxxx/.zdirs", O_RDONLY|O_NOCTTY) = 3
fcntl(3, F_GETFL) = 0x8000 (flags O_RDONLY|O_LARGEFILE)
fstat(3, {st_mode=S_IFREG|0644, st_size=452, ...}) = 0
read(3, "/home/xxxx/Some/Path"..., 4096) = 452
read(3, "", 4096) = 0
close(3) = 0
access("/home/xxxx/Some/Path/inside", F_OK) = 0
rt_sigprocmask(SIG_BLOCK, [CHLD], [CHLD WINCH], 8) = 0
rt_sigprocmask(SIG_UNBLOCK, [CHLD], [CHLD WINCH], 8) = 0
stat("/home/xxxx/Some/Path", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
rt_sigprocmask(SIG_BLOCK, [CHLD], [WINCH], 8) = 0
mmap(NULL, 16384, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f979e7b4000
stat(".", {st_mode=S_IFDIR|0700, st_size=4096, ...}) = 0
chdir("/home/xxxx/Some/Path") = 0
stat("/home/xxxx/Some/Path", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
stat(".", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
rt_sigprocmask(SIG_BLOCK, [CHLD], [CHLD WINCH], 8) = 0
rt_sigprocmask(SIG_UNBLOCK, [CHLD], [CHLD WINCH], 8) = 0
rt_sigprocmask(SIG_BLOCK, [CHLD], [WINCH], 8) = 0
stat(".", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
chdir("/home/xxxx")
注意看上面stat那几行,我在家目录执行的,但是他会stat 我上一次用过的目录 @_@ 这个不太好吧……
显然这个行为和 .zdirs 文件脱不了干系,打开一看,果然这个打不开的目录就在里面第一条,果断删除。
再次启动zsh,问题解决~ 轻松愉快XD
既然搞定了一个问题,那顺便搞搞我一直疑惑的一个问题:为毛我的Ctrl-E反应就没有Ctrl-A灵敏呢?
每次移动到行首,C-a,直接过去了;移动到行尾,C-e,等一秒,光标才过去,唉……神经病的zsh
今天既然想到了,那就查一查咯~
具体过程略过不提,说说原因和解决方案:
我的arch系统装了一个grml-zsh-config 的包,里面带了一个 /etc/zsh/zshrc 的配置文件,设定了一个键绑定:
^ed => insert-datestamp 也就是说 Ctrl-E,d 这个组合可以插入日期,这就是为什么我移动到行尾会有延迟了,他在等我是不是按 d 键!
心累……
懒得修改 /etc下面的了,直接改我的配置文件 .zshrc:
bindkey -r "^Ed"
搞定!
网友评论