基于regexp的bash alias-like命令识别

roo*_*ahn 1 bash

我怎样才能在bash中通过正则表达式解析命令然后用预先设置的正确替换它?

让我们说,在将回购网址粘贴到终端之前,我总是忘记键入"git clone".

现在bash将解析输入包含字符串"git"和"@"并以".git"结尾的任何命令,并用之前添加的"git clone"替换整行.

这将使一千个命令变得更容易.任何的想法?

Cha*_*ffy 6

您可以提供一个名为command_not_found_handle哪个进程的函数,以及尚未找到的命令.

command_not_found_handle() {
  local cmd_str

  # change the argument-list array back to a string
  printf -v cmd_str '%q ' "$@"

  # process that string:
  case $cmd_str in
    "git@"*".git") eval "git clone $cmd_str" ;;
    *) echo "No alternative for command found" >&2; return 1 ;;
  esac
}
Run Code Online (Sandbox Code Playgroud)

使用case语句评估glob样式而不是正则表达式; 你可以允许更灵活的语法通过启用extglob 选项,或使用一堆if [[ $str =~ $pattern ]]测试,而不是case如果你真的,真的不希望正则表达式.

  • 确实; 使用MacPorts或类似的方法安装bash 4是明智的. (3认同)
  • 请注意,这需要bash 4.x; Mac上的`/ bin/bash`仍然是El Capitan的3.2(由于Apple与Bash 4中的许可之间存在分歧,因此可预见的未来). (2认同)