我四处搜寻,找不到答案。
我想定义一个这样的函数
function \d{2} () {
echo $1_or_smth
}
然后如果我在我的终端说
12
我希望它回显 12。
答案1
以下方法适用于 zsh:
preexec() {
if [[ $1 = <-> ]]; then
$1() {
echo $0
unfunction $0
}
fi
}
正如您的问题的评论中所指出的,您不能拥有带有变量名称的函数。它的作用是preexec
在命令失败之前使用钩子拦截命令并创建临时函数。我使用它的一个变体,即 nmh 邮件程序,用于按编号显示电子邮件消息。
答案2
通过 bash,您可以使用该command_not_found_handle
函数。
小心一点A)一些发行版已经使用它来提供他们的“安装富巴如果你想使用富命令”功能,以及b)它不会像 shell 函数那样覆盖外部命令。
另请注意,\d
bash 使用的正则表达式方言不支持该=~
操作符(顺便说一句,这是 bash 中正则表达式的唯一使用)。
2digits(){
echo "$1_or_smth"
}
command_not_found_handle(){
if [[ $1 =~ ^[0-9]{2}$ ]]; then 2digits "$@"
else printf >&2 '%s: command not found\n' "$1"; return 127
fi
}
然后
$ 33
33_or_smth
$ 444
444: command not found
同样的事情在 zsh 中也可以使用该command_not_found_handler
函数(注意名称差异——zsh 中有一个额外的“r”)。
preexec
虽然您可以使用 bash 中的陷阱来模拟 zsh DEBUG
,但您将无法从其他答案中实现这一技巧,因为 bash 不允许函数名称仅包含数字。