为什么我的ZSH脚本会打印出所有历史记录,但仅限于Ubuntu?

时间:2015-03-17 17:27:00

标签: ubuntu zsh oh-my-zsh

我已经为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]
$

任何想法会导致两个平台之间的这种差异?我知道他们完全一样,我从完全相同的回购中克隆了。

2 个答案:

答案 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扩展已损坏或其他东西。