【问题标题】:zsh: command not found: lszsh:找不到命令:ls
【发布时间】:2012-04-18 16:55:28
【问题描述】:

我在使用 zsh 时遇到了一个相当奇怪的问题。当我启动我的 shell 时,一切——函数、环境变量、别名等——都可以正常工作。我创建了以下函数并在 zsh 中获取它:

clean()
{
    path=/tmp    
    for i in ${path}/*; do
      echo $i
    done
}

在终端中运行clean 按预期工作,因为它会打印出 /tmp/ 中的所有文件。然而,之后,尝试 any 命令 - 例如,ls - 会产生以下结果:

zsh: command not found: ls

我还有其他几个可以正常工作的函数,这让我相信不知何故,这个循环导致了问题。无论如何,这非常令人沮丧,我真诚地感谢社区的眼睛。谢谢!

【问题讨论】:

  • 这个脚本不打印任何东西,它只是创建一个函数。请告诉您重现错误所采取的具体步骤。
  • 创建函数后,我在zsh中简单运行clean。我会更新帖子以使其更清晰。
  • 在运行之前是否为您的环境中的其他任何内容添加了别名?
  • qor - 没有。即使我将函数的名称更改为“foobar123”,我仍然会遇到同样的问题。
  • 无法重现 - 完全符合我的预期。这一定是您环境中其他地方的问题。

标签: function loops zsh


【解决方案1】:

问题在于分配 path 变量 - 因为 zsh 保留了该变量(除了 PATH),覆盖它会删除 shell 查找 any 命令的能力。

正确答案当然是使用$path以外的变量:

local_path=/tmp    
for i in ${local_path}/*; do
  echo $i
done

【讨论】:

  • 接受您的回答。我怀疑您正在覆盖 PATH 变量。这是非常重要的。使用一个不在环境中的不同的。例如,CLEAN_PATH 不应该有这种影响。
  • 哦,天哪……这有多明显。谢谢你。 :)
  • 尝试在set -x 之后运行您的原始函数,看看跟踪是否告诉您任何信息。
  • 显然这是关于 zsh.sourceforge.net/Doc/Release/Parameters.html#SEC98 PATH 和路径的文档,但 zsh 两者都有,这意味着你不应该混淆它们。
  • 大声笑,你应该接受我的回答,因为我在几分钟前说过同样的话......
【解决方案2】:

我猜它会覆盖变量path,这是用于查找命令的变量。这就是它不再找到命令的原因。

【讨论】:

    【解决方案3】:

    我挖了几个小时才再次找到这个。 Zsh 提供了一个很好的技巧来从 PATH 类型的变量中删除重复项,这有点离题,但可能很有用:

    typeset -T PYTHONPATH pythonpath
    typeset -U pythonpath
    
    1. 第一行将 PYTHONPATH 冒号分隔的字符串绑定到 zsh 数组
    2. 第二次删除重复项

    【讨论】:

      猜你喜欢
      • 2017-03-03
      • 2019-11-25
      • 2016-07-30
      • 2015-07-01
      • 2017-08-09
      • 2016-04-12
      • 2016-06-26
      • 2021-12-15
      相关资源
      最近更新 更多