2

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

一个简化版的shell脚本如下

#!/bin/sh

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

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

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

试过这是bash它正常工作的地方,所以这是一个zsh问题。

4

2 回答 2

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这比事后修复它要好。

于 2013-10-08T17:47:52.320 回答
1

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

于 2013-10-07T13:44:08.163 回答