防止 print -P 替换环境变量

防止 print -P 替换环境变量

我在用提示纯正如我在 zsh 中的提示。它在内部用于print -Pn ...打印当前目录。由于某种原因,如果我设置了与当前目录开头匹配的环境变量,则该环境变量名称将被替换到输出中。

例如,

> export SOME_DIR=/home/bschlenk/some/path
> cd ~/some/path/deeper/nested/path
> print -Pn %~
~SOME_DIR/deeper/nested/path

如何防止它将随机环境变量替换到恰好匹配的路径中?我希望它打印出当前路径,并/home/bschlenk替换为~,但没有其他替换。

答案1

来自的文档%~:

如果它有一个命名目录作为其前缀,则该部分将替换为~后跟目录名称,但前提是结果短于完整路径

参考如下动态的静止的命名目录。您看到的是一个静态命名目录

如果 后面的文本~是值以 开头的字符串 shell 参数的名称,也可以定义它们/

因此,如果变量的值为SOME_DIR/home/bschlenk/some/path~SOME_DIR是一个静态命名目录,其值为/home/bschlenk/some/path。提示扩展%~会看到/home/bschlenk/some/path并将其缩写为~SOME_DIR

但这还不是故事的全部。事实上,只有当SOME_DIR使用“激活”时才会出现缩写~SOME_DIR时才会出现缩写。这记录在选项auto_name_dirs,无需事先激活,但默认关闭。

任何设置为目录绝对名称的参数都会立即成为该目录的名称,该名称将由 和相关提示序列使用%~,并且在对以 开头的单词执行补全时可用~。 (否则,参数必须~param首先在表单中使用。)

激活%~替换(并在 后完成~)的参数显示为命名目录哈希表您可以使用 列出hash -d

我们将这些碎片放在一起以了解发生了什么。你如何解决你的问题?这取决于什么原因导致SOME_DIR被激活。

如果您打开了该选项auto_name_dirs,那么显然您应该将其关闭。

如果您以前使用过~SOME_DIR,可以使用以下命令停用它

unhash -d SOME_DIR

这不是永久性的:如果您再次使用,它会再次弹出~SOME_DIR。但考虑到你可以$SOME_DIR在任何可以使用的地方使用~SOME_DIR~SOME_DIR这并不是一个非常有用的功能。

如果您无法摆脱SOME_DIR命名目录的组成部分,并且您想仅使用$HOME→来缩写当前目录~,则可以手动实现此转换。

if [[ $PWD = $HOME ]]; then
  HPWD=\~
elif [[ $PWD = $HOME/* ]]; then
  HPWD=\~/${PWD#$HOME/}
else
  HPWD=$PWD
fi

然后使用print -rn $HPWD代替print -Pn %~.

如果您无法阻止SOME_DIR成为命名目录并且无法更改使用的代码%~,那么事情就会变得更加棘手。您可以使用 清空目录哈希表hash -r,但无法使其成为函数的本地函数(仅适用于子 shell)。

相关内容