cd TEst

cd TEst

我在 OS X 上使用 zsh 和 oh-my-zsh 作为我的 shell 环境,我很难追踪发生的事情是否是 oh-my-zsh 函数的结果或 zsh 的默认行为;这完全是一个表面问题,但它让我抓狂。

简而言之,如果我cd进入一个目录,那么在我的提示中打印的内容%c确切地传递给的参数cd;因此,如果我切换到目录“test”,但我不小心将其拼写为“tEst”,那么“tEst”就会出现在我的提示中。这非常烦人。

另一个例子是当我使用这个 shell 函数时(简化为布雷特·特普斯特拉

cdf()
 {
   target=`osascript -e 'tell application "Finder" to get POSIX path of (target of front Finder window as text)'`
   cd ${target}
 }

当我使用此功能时,无论我最终进入哪个目录,我的工作目录都会像~target我的提示一样显示。

就像我说的,这些完全是表面问题,但这让我抓狂。这是 zsh 的问题,还是我的 zsh 的问题,或者我可以在提示设置中使用其他扩展来解决这个问题?我使用的是 iTerm 2,但我在 Terminal.app 中尝试过,结果也发生了同样的事情。

答案1

您的问题的两个部分有不同的解决方案。

cd TEst

这种行为是由两个怪癖相互作用而产生的:

  • OS X 默认使用不区分大小写的文件系统。
  • Shell 设置PWD为“命令设置的当前工作目录cd”,而不是getcwd系统调用报告的绝对路径。

后一种怪癖允许您使用符号链接,就像它们是普通目录一样。通过记住您输入的路径而不是绝对路径,shell 允许您cd symlink...cd ..返回到您开始的位置。在不区分大小写的文件系统上,像 这样的拼写错误cd TEst就像符号链接一样,设置PWD为您输入的路径而不是目录的文件系统名称。

要解决此问题,您可以使用$(pwd -P)来获取所报告的规范路径,getcwd而不是 shell 的逻辑路径。请注意,这会产生解析路径中的所有符号链接的副作用。要模仿 的格式,请%c使用:$(basename $(pwd -P | sed "s#$HOME#~#"))

或者,您可以将文件系统转换为区分大小写,但某些 OS X 应用程序(如 Steam 和 Photoshop)不兼容。

cd ${target}

我无法在 OS X 中用简单的方法重现此行为zsh– 这可能是 oh-my-zsh 或您的配置的问题。虽然您可以使用相同的$(pwd -P)解决方法,但如果无法解析到合法路径,其他脚本和程序可能会失败$PWD。如果您可以使用最小 oh-my-zsh 安装重现此问题,则应向维护人员报告错误。

相关内容