我可以扩展命令添加我自己的别名吗?

我可以扩展命令添加我自己的别名吗?

我创建了一些别名来处理nodejs项目,例如:

alias lsc="cat package.json | jq '.scripts'"

列出scriptspackage.json文件部分中的所有可用命令

理想情况下,我想将其作为npm scriptsnpm 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
}

这将创建scriptshummuscinnamonbaubles命令来调用其他命令。如果函数的第一个参数与任何自定义子命令都不匹配,则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

相关内容