我有一个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
问题。
答案 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 ~project
或ls -lh ~project
之类的操作作为该目录的快捷方式。
如果您不喜欢在提示中显示为~project
的目录,则可以
在提示中将%~
替换为%d
,以便始终显示完整路径。
如果您根本不想要这种行为,请在配置中执行unsetopt AUTO_NAME_DIRS
。
如果你想保持选项,但是在脚本中禁用它,这样它就不会使result
成为命名目录,而是在脚本顶部执行emulate -LR zsh
。在脚本运行时,这会暂时将所有选项重置为其默认值。最好的做法是始终在脚本中使用emulate -LR zsh
来防止发生这种奇怪的事情。这比在unhash -d result
之后修复它更好。
答案 1 :(得分:1)
这似乎是使用静态命名目录的情况。由于result
的值是一个以/
开头的路径(大概),zsh
正在使用该变量作为路径的“名称”,并在显示完整路径时将其缩写为你的提示。有关详细信息,请参阅“静态命名目录”下的man zshexpn
。