我想知道是否有办法让bash识别我有时做的特定错误类型(缺少空格)并“修复”命令。示例:如果我输入gitadd (没有git和add之间的空格),我如何使bash知道我指的是git add并运行命令?
当然,我可以为此创建一个别名,但我不想为所有可能的命令创建别名--而且我不仅想为git创建别名,还想为任何命令创建别名(所以ls-l变成ls -l,cd~/somedir变成cd ~/somedir,等等)。
在一般的形式中,[existent-command][param] (没有空格)变成[existent-command] [param] (在它们之间有一个空格)。Bash识别它并运行命令。
我真的找不到一个方法来做这个(除了创建很多别名)。巴什能做到吗?我需要一些外部工具(可能使用另一种语言)吗?
发布于 2017-02-23 19:47:57
一般来说,这有点昂贵,因为实际上您必须尝试每一个可能的地方,在“错误”命令中插入一个空格,并查看这是否会产生一个有效的命令/参数对。gitadd能被分割成
g itaddgi taddgit addgita ddgitad d更糟糕的是,可能存在多个有效对。如果我有一个名为gi的命令,那么gitadd应该是git add还是gi tadd?
但是,对于您的情况,如果您想假设以git开头的任何命令都应该拆分,则可以定义command_not_found_handle (在bash 4或更高版本中)来为您的用户尝试拆分。将以下内容添加到.bashrc中
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通常对未识别的命令所做的操作。
发布于 2017-02-24 12:07:43
我修改了上面建议的代码,以便从我的路径中读取命令名,并在循环中检查它们(并在运行后返回命令退出代码)。基本上:
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有了这个,我就涵盖了一系列的命令,而且它运行得很好。再次感谢!
https://stackoverflow.com/questions/42424670
复制相似问题