动态创建别名

动态创建别名

我想根据命令、其子命令和选项创建别名。我希望别名是这些组件的首字母缩写。

用真实的例子来解释会更简单:

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--debugmccdmctdmcpdmcid

我尝试过类似的事情:

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的字符,因此给了我们 的第一个字符。$parameteroffset${cmd:0:1}$cmd

which word检查是否word存在于 中$PATH。 使其-s静音,因此我们只获取退出值(0如果找到,1如果未找到),然后我们使用该值仅在找到时||执行命令aliaswhich不是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'

相关内容