我已经为ZSH克隆了一套非常受欢迎的点文件,你可以在这里看到回购:https://github.com/aronchick/dotfiles
在MacOS X(Yosemite)上,它的效果非常好,完全符合预期。另一方面,在Ubuntu上,它在执行每个命令之前重复我的整个历史记录。例如:
在Mac上:
# aronchick at mbp.com in ~/Public [10:22:01]
$ ls
Drop Box
# aronchick at mbp.com in ~/Public [10:22:03]
$
在Ubuntu 14.04上:
# aronchick at ub.mbp.com in ~/Public [10:23:35]
$ ls -la
[100+ lines of history]
git submodule init
ls -la
cd ..
ls -la
cd ..
ls
ls -la total 8
drwxr-x--- 2 aronchick wheel 4096 Mar 17 10:23 .
drwxr-xr-x 25 aronchick wheel 4096 Mar 17 10:23 ..
-rw-r--r-- 1 aronchick wheel 0 Mar 17 10:23 DropBox
# aronchick at ub.mbp.com in ~/Public [10:23:39]
$
任何想法会导致两个平台之间的这种差异?我知道他们完全一样,我从完全相同的回购中克隆了。
答案 0 :(得分:2)
好的,所以我发现了问题所在,但不是如何解决它(或者为什么这样做)。
首先,感谢这个(How to debug Shell command after customization)堆栈溢出问题,我发现你可以执行zsh -x
并让它在执行之前打印出每个shell的每一行。最终,它归结为这一行:
function set_running_app {
echo -ne "\e]1; $PWD:t:$(history $HISTCMD | cut -b7- ) \a"
}
我不知道这是打算做什么的(看起来它试图打印出前一个命令的一个子集作为命令行的一部分,但为什么它只是从字节7开始超出我的意义),它似乎没有在其他地方使用。我也不知道为什么它在Mac上运行(?)而不是在Ubuntu盒子上。
评论这个解决了它。
答案 1 :(得分:2)
我遇到了同样的问题 - 在ze-best-zsh-config中可以找到同样的命令。如果您正在运行screen
,则还会在OS X上发生Ubuntu行为。
扩展aronchick的答案,我认为这里有两件事情。
"\e[1; ... \a"
是设置标题栏的xterm escape sequence。我认为核心问题是这个转义序列在某些环境中不能正确处理(例如,screen
下的Ubuntu或OS X),因此它会呈现给终端。我不确定这里究竟是什么问题,但我发现唯一真正的解决方案是完全删除set_running_app
函数。
在我的系统上(运行oh-my-zsh)我发现了另外一个皱纹,即history
命令实际上是fc -l 1
的别名。我认为这可能是zsh下的半标准别名,但有一个效果是始终打印出完整的历史记录,即使传递了历史记录条目号。 ($HISTCMD
返回历史记录中的最后一个条目号,因此history $HISTCMD
通常只返回最后一个历史记录条目。| cut -b7-
部分删除条目号本身,只留下命令。)< / p>
因此,假设此命令旨在将标题栏设置为当前正在执行的程序,例如。如果你运行vi
,标题栏会在运行时说“vi”。但我无法弄清$PWD:t:
部分的用途。看起来这可能是zsh扩展已损坏或其他东西。