我想在 bash 中创建一个函数或别名或命令完成,它将命令作为“dfk-1234”或“DFK-nnnnn”(数字可以是 1 到 5 位数字,不是零填充),然后运行命令“dfkp DFK-nnnn”。
争论应该逐字逐句地传递。 “dfk-18875 cat file.txt”应变为“dfpk DFK-18875 cat file.txt”。
我认为命令完成或选项卡扩展可以工作,但无法弄清楚当数字发生变化时如何执行此操作。
最好的方法是什么?一旦我可以处理主命令名称,那么我就可以处理其余的(大小写、参数等)。
答案1
重击 4.0引入了新功能用于处理未找到的命令 - 它将调用名为 的函数command_not_found_handle
(如果该函数存在)。您可以使用该行为拦截对名为 dfk-NNN 或 DFK-NNN 的“程序”的调用,并根据需要重新运行它们。由于我们已经依赖 4.0 的行为,因此我也使用了 upper-casing 和 lower-casing 参数扩展功能。
command_not_found_handle() {
case "${1,,}" in
(dfk-?|dfk-??|dfk-???|dfk-????|dfk-?????)
echo dfkp "${1^^}" "${@:2}"
return 0
;;
(*)
printf 'bash: %s: command not found\n' "$1" >&2
return 127
;;
esac
}
如果输入不存在的命令,bash 将使用原始命令行调用此函数。该case
语句将第一个参数小写,以便更容易将其与dfk
所需的模式进行比较。
如果命令以dfk-
1、2、3、4 或 5 个字符开头和结尾(将其收紧为您认为合适的数字),那么它当前会回显以进行调试,但随后会使用以下命令调用dfkp
程序第一个参数是初始 dfk 条目的大写版本,后面是命令行的其余部分。
对于不匹配的命令dfk-NNNN
,它会失败并向 stderr 打印模拟的 bash 错误消息并返回 127。(这与默认行为匹配,就好像 command_not_found_handle 不存在一样)。
示例会话(安装了 echo 调试,因为我没有实际的 dfkp 程序):
$ dfk-1234
dfkp DFK-1234
$ dfk-18875 cat file.txt
dfkp DFK-18875 cat file.txt
$ some-other-command
bash: some-other-command: command not found
$ dfk-1
dfkp DFK-1
$ dfk-12345
dfkp DFK-12345