来自zsh的cd显示错误的cwd名称(〜变量)

时间:2013-10-07 12:37:36

标签: shell unix zsh

我有一个shell脚本,使用zsh通过alias wd=". /path/to/wd"中的别名运行。该脚本执行ruby程序并将cd s输出到它的输出。它可以工作,但在cd命令之后,目录显示为“〜result”而不是它的实际名称。

shell脚本的简化版本如下

#!/bin/sh

result=$(ruby engine.rb $*)
cd $result

这显然与cd使用变量“result”有关,因为这是它得到的名称。

如果更改到另一个目录并且仍然使用了错误的名称。

尝试这是bash,它正常工作,因此这是一个zsh问题。

2 个答案:

答案 0 :(得分:3)

这是由AUTO_NAME_DIRS选项(默认情况下未启用)引起的:

         AUTO_NAME_DIRS

         Any parameter that is set to the absolute name of a directory
         immediately becomes a name for that directory, that will be used
         by the `%~' and related prompt sequences, and will be available
         when completion is performed on a word starting with `~'.
         (Otherwise, the parameter must be used in the form `~param' first.)

换句话说,只要您执行类似操作,就会启用AUTO_NAME_DIRS project=/path/to/my/project~project成为/path/to/my/project的缩写。 这使您可以执行cd ~projectls -lh ~project之类的操作作为该目录的快捷方式。

如果您不喜欢在提示中显示为~project的目录,则可以 在提示中将%~替换为%d,以便始终显示完整路径。

如果您根本不想要这种行为,请在配置中执行unsetopt AUTO_NAME_DIRS

如果你想保持选项,但是在脚本中禁用它,这样它就不会使result成为命名目录,而是在脚本顶部执行emulate -LR zsh。在脚本运行时,这会暂时将所有选项重置为其默认值。最好的做法是始终在脚本中使用emulate -LR zsh来防止发生这种奇怪的事情。这比在unhash -d result之后修复它更好。

答案 1 :(得分:1)

这似乎是使用静态命名目录的情况。由于result的值是一个以/开头的路径(大概),zsh正在使用该变量作为路径的“名称”,并在显示完整路径时将其缩写为你的提示。有关详细信息,请参阅“静态命名目录”下的man zshexpn