![我可以扩展命令添加我自己的别名吗?](https://linux22.com/image/164274/%E6%88%91%E5%8F%AF%E4%BB%A5%E6%89%A9%E5%B1%95%E5%91%BD%E4%BB%A4%E6%B7%BB%E5%8A%A0%E6%88%91%E8%87%AA%E5%B7%B1%E7%9A%84%E5%88%AB%E5%90%8D%E5%90%97%EF%BC%9F.png)
我创建了一些别名来处理nodejs
项目,例如:
alias lsc="cat package.json | jq '.scripts'"
列出scripts
该package.json
文件部分中的所有可用命令
理想情况下,我想将其作为npm scripts
或npm something
但是npm
我的路径中现有的可执行程序来运行。
是否可以扩展此功能以添加我自己的别名?
答案1
免责声明:我知道没有什么关于 Node.js 或npm
.
使用覆盖该命令的 shell 函数npm
:
npm () {
if [ "$1" = scripts ]; then
jq '.scripts' package.json
else
command npm "$@"
fi
}
此 shell 函数检测函数的第一个参数是否是字符串scripts
。如果是,它将运行您的jq
命令。如果不是,它将npm
使用原始命令行参数调用实际命令。
该command
实用程序确保功能不被调用(否则会创建无限递归)。
上面的代码可以放在定义普通别名的任何地方。
如果npm
已经是一个 shell 函数,这将无法做正确的事情。
将其扩展到许多新的子命令,if
- then
-elif
代码会很混乱。反而:
npm () {
case $1 in
scripts) jq '.scripts' package.json ;;
hummus) hummus-command ;;
cinnamon) spice-command ;;
baubles) stuff ;;
*) command npm "$@"
esac
}
这将创建scripts
、hummus
和cinnamon
子baubles
命令来调用其他命令。如果函数的第一个参数与任何自定义子命令都不匹配,则npm
像以前一样调用实际命令。
请注意,添加替代方案现存的 npm
子命令将覆盖该子命令npm
。如果你想这样称呼真实的来自您自己的替代子命令的子命令,调用command npm "$@"
(假设您没有调用shift
来关闭子命令名称,在这种情况下您想调用command npm sub-command "$@"
)。
每个新的子命令都可以访问该函数的命令行参数,但您可能希望shift
子命令的名称从列表中删除:
npm () {
case $1 in
scripts) jq '.scripts' package.json ;;
hummus)
shift
echo '"npm hummus" was called with these additional arguments:'
printf '%s\n' "$@"
;;
*) command npm "$@"
esac
}
最后一个函数运行的示例:
$ npm hummus "hello world" {1..3}
"npm hummus" was called with these additional arguments:
hello world
1
2
3