Bash 完成并改变数字?

Bash 完成并改变数字?

我想在 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

相关内容