我想根据命令、其子命令和选项创建别名。我希望别名是这些组件的首字母缩写。
用真实的例子来解释会更简单:
alias mc="mvn compile"
alias mt="mvn test"
alias mp="mvn package"
alias mi="mvn install"
alias mcc="mvn clean compile"
alias mct="mvn clean test"
alias mcp="mvn clean package"
alias mci="mvn clean install"
alias mcco="mvn clean compile --offline"
alias mcto="mvn clean test --offline"
alias mcpo="mvn clean package --offline"
alias mcio="mvn clean install --offline"
因此,如果我想添加一个新的子命令,我试图创建一个函数来创建别名,而不必复制粘贴所有这些命令,就像创建validate
相对别名(mv
,, )或使用新选项(mcv
,,, )等相同的东西应该很简单。mcvo
--debug
mccd
mctd
mcpd
mcid
我尝试过类似的事情:
m="mvn "
c="clean "
p="package "
"`$m$c$p`" # doesn't work
答案1
做这个一定要小心。
在此处添加validate
命令将创建一个mv
别名,隐藏mv
用于移动文件的命令。您可能会遇到其他命名冲突。下面的解决方案提供了一些保护,但如果您定义别名,然后在$PATH
之后添加同名的可执行文件,则不会有帮助。如果您在运行命令时引用该命令(例如"mv"
),这将阻止别名扩展并运行实际命令,而不是别名。
解决方案:
您可以通过循环遍历命令并为每个选项集仅使用一个别名命令来修剪它。为了动态添加更多别名集,我们可以将命令放在函数中:
gen_aliases() {
local cmd="${1:?No command to create aliases for.}"
local c=${cmd:0:1}
which -s m${c} || alias m${c}="mvn $cmd"
which -s mc${c} || alias mc${c}="mvn clean $cmd"
which -s mc${c}o || alias mc${c}o="mvn clean $cmd --offline"
}
for cmd in compile test package install; do
gen_aliases "$cmd"
done
${parameter:?word}
是一个参数扩展,word
如果未设置或为空,则写入标准错误并退出函数或脚本parameter
。为我们提供了一些健全性检查,以确保在没有命令执行的情况下我们不会创建别名。
${parameter:offset:length}
是一个参数扩展,它扩展到从 开始length
的字符,因此给了我们 的第一个字符。$parameter
offset
${cmd:0:1}
$cmd
which word
检查是否word
存在于 中$PATH
。 使其-s
静音,因此我们只获取退出值(0
如果找到,1
如果未找到),然后我们使用该值仅在找到时||
执行命令alias
which
不是word
在 中查找$PATH
。
检查结果:
$ type mc
mc is aliased to `mvn compile'
$ type mcpo
mcpo is aliased to `mvn clean package --offline'
并添加另一组别名:
$ gen_aliases validate
$ type mv
mv is /bin/mv
$ type mcv
mcv is aliased to `mvn clean validate'