你能做一个函数来处理 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.c 的 execute()
函数中 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 行为的逻辑。
我最好的建议是从您的路径中删除点 (.
)。
所以我正在使用 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.c 的 execute()
函数中 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 行为的逻辑。
我最好的建议是从您的路径中删除点 (.
)。