首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >动态识别丢失的空间错误类型并运行对应命令(没有别名)

动态识别丢失的空间错误类型并运行对应命令(没有别名)
EN

Stack Overflow用户
提问于 2017-02-23 19:37:53
回答 2查看 58关注 0票数 0

我想知道是否有办法让bash识别我有时做的特定错误类型(缺少空格)并“修复”命令。示例:如果我输入gitadd (没有gitadd之间的空格),我如何使bash知道我指的是git add并运行命令?

当然,我可以为此创建一个别名,但我不想为所有可能的命令创建别名--而且我不仅想为git创建别名,还想为任何命令创建别名(所以ls-l变成ls -lcd~/somedir变成cd ~/somedir,等等)。

在一般的形式中,[existent-command][param] (没有空格)变成[existent-command] [param] (在它们之间有一个空格)。Bash识别它并运行命令。

我真的找不到一个方法来做这个(除了创建很多别名)。巴什能做到吗?我需要一些外部工具(可能使用另一种语言)吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-02-23 19:47:57

一般来说,这有点昂贵,因为实际上您必须尝试每一个可能的地方,在“错误”命令中插入一个空格,并查看这是否会产生一个有效的命令/参数对。gitadd能被分割成

  • g itadd
  • gi tadd
  • git add
  • gita dd
  • gitad d

更糟糕的是,可能存在多个有效对。如果我有一个名为gi的命令,那么gitadd应该是git add还是gi tadd

但是,对于您的情况,如果您想假设以git开头的任何命令都应该拆分,则可以定义command_not_found_handle (在bash 4或更高版本中)来为您的用户尝试拆分。将以下内容添加到.bashrc

代码语言:javascript
复制
command_not_found_handle () {
    if [[ $1 == git* ]]; then
        git "${1#git}" "${@:2}"
    else
        printf 'bash: %s: command not found\n' "$1" >&2
        return 127
    fi
}

如果找不到像gitadd这样的命令,则调用上面的函数,并使用gitadd及其参数作为函数的参数。${1#git}将展开add (gitadd减去前缀git),然后使用适当的参数调用git。否则,我们重复bash通常对未识别的命令所做的操作。

票数 3
EN

Stack Overflow用户

发布于 2017-02-24 12:07:43

我修改了上面建议的代码,以便从我的路径中读取命令名,并在循环中检查它们(并在运行后返回命令退出代码)。基本上:

代码语言:javascript
复制
CMDS=(find files in PATH)
for c in $CMDS do
  if [[ $1 == ${c}* ]]; then
    ${c} "${1#${c}}" "${@:2}"
    return $?
  fi
done
printf 'bash: %s: command not found\n' "$1" >&2
return 127

有了这个,我就涵盖了一系列的命令,而且它运行得很好。再次感谢!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42424670

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档