你能做一个函数来处理 zsh 上被拒绝的权限,比如找不到命令吗

can you make make a function to handle permission denied on zsh like command not found

所以我正在使用 zsh。我有一堆功能可以让我四处走动——比如如果我在任何地方输入“bin”——我会转到 ~/bin 等。我通过挂钩到 command_not_found_handler 来做到这一点:

command_not_found_handler() {
   if [ -f ~/bin/marked/ ]; then
      directory=$(<~/bin/marked/)"
      echo cd \"$directory\" >~/source_function
      return 0
   ...

这非常有效 - 无论我身在何处,我都可以输入 marker blah - 它会创建一个标记,从那时起,无论我身在何处,如果我输入 blah,它就会返回到我标记的那个目录。

除了。

我有“。”在我的道路上。 (是的,我知道你认为我不应该那样做)

如果在当前目录中碰巧有一个“blah”文件——而不是去命令未找到处理程序——它会尝试执行那个,当然它不是一个可执行脚本,所以我得到“权限被拒绝

有没有什么办法可以捕获这个被拒绝的权限,就像我捕获没有找到的命令一样? “脚本”这个词真的让我印象深刻——因为我喜欢输入脚本将我带到我的个人脚本目录——但我写的每个程序在 git 回购协议中也有一个脚本目录,用于存放与之相关的脚本存储库。

除了从您的路径中删除 .(您不想这样做)之外,我看不到配置 zsh 以避免执行(或尝试执行)与当前目录中的给定命令。 zsh 有 lots of options,但我没有看到任何相关文档的描述,也没有看到源代码支持。

我根据阅读 https://sourceforge.net/p/zsh/code/ci/master/tree/Src/exec.cexecute() 函数中 zsh 处理的源代码做出此声明。在这里,当 zsh 在路径中看到点 (.) 时,它会尝试在该目录中执行该名称的文件:

    for (pp = path; *pp; pp++)
        if (!(*pp)[0] || ((*pp)[0] == '.' && !(*pp)[1])) {
            ee = zexecve(arg0, argv, newenvp);
            if (isgooderr(ee, *pp))
                eno = ee;
          } else {
            z = buf;
            strucpy(&z, *pp);
            *z++ = '/';
            strcpy(z, arg0);
            ee = zexecve(buf, argv, newenvp);
            if (isgooderr(ee, *pp))
                eno = ee;
        }

之后,execute() 函数到达下面的代码并调用 zerr(),这会产生“权限被拒绝”错误消息:

if (eno)
    zerr("%e: %s", eno, arg0);
else if (commandnotfound(arg0, args) == 0)
    _realexit();
else
    zerr("command not found: %s", arg0);

...在这种情况下,代码中没有拦截 zsh 行为的逻辑。

我最好的建议是从您的路径中删除点 (.)。