zsh: 命令未找到: ls

6

我在使用zsh时遇到了一个奇怪的问题。当我启动我的shell时,所有的函数、环境变量、别名等都能正常工作。我创建了下面的函数并在zsh中引用它:

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

在终端中运行 clean 命令时,它按预期工作并打印出 /tmp/ 目录下的所有文件。然而,在此之后,尝试执行任何命令 - 例如 ls 命令 - 都会产生如下输出:
zsh: command not found: ls

我有其他几个正常运作的功能,这让我相信某种方式,那个循环引起了问题。无论如何,这非常令人沮丧,我真诚地感谢社区的帮助。谢谢!


这个脚本不会打印任何东西,它只是创建了一个函数。请告诉我您重现错误所采取的确切步骤。 - wRAR
创建函数后,我只需在zsh中运行clean。我会更新帖子以使其更清晰。 - ABach
在运行之前,您的环境中是否将“clean”别名为其他任何内容? - AlG
即使我将函数名更改为“foobar123”,问题仍然存在。 - ABach
无法复现 - 对我来说完全按预期工作。这一定是您的环境中其他地方出了问题。 - ire_and_curses
你应该修改你的问题,包括完整的代码,以及你对 $path 进行了哪些更改。 - xenoterracide
3个回答

8
问题在于分配 path 变量 - 因为 zsh 已经把这个变量保留了(除了 PATH 之外),覆盖它会使 shell 无法找到任何命令。
当然,正确的做法是使用除 $path 以外的其他变量。
local_path=/tmp    
for i in ${local_path}/*; do
  echo $i
done

接受你的答案。我怀疑你在覆盖 PATH 变量,这个变量非常重要。请使用一个不在环境变量中已存在的不同变量名。比如说,CLEAN_PATH 不应该有这种影响。 - xenoterracide
哦,我的天啊...那是多么明显。谢谢 :) - ABach
尝试在 set -x 后运行您的原始函数,看看跟踪是否会告诉您任何信息。 - Dennis Williamson
显然这是关于此的文档 http://zsh.sourceforge.net/Doc/Release/Parameters.html#SEC98 PATH 和 path 是不同的,但 zsh 都有,这意味着你不应该搞乱它们。 - xenoterracide
哈哈,你应该接受我的答案,因为我几分钟前就说了同样的话... - o0'.

1

我猜它覆盖了被用于查找命令的变量path,所以它不再能够找到命令。


0

我花了几个小时才找到这个。Zsh提供了一个不错的技巧,可以从PATH类型的变量中删除重复项,虽然有点离题,但可能会很有用:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接