上次介绍的通过写 shell 函数的小技巧,大家觉得不错。今天继续分享一个。不过在正文之前先更正下上篇文章的两个错误。
function b {
# $# 命令参数个数, $* 参数列表
if [ $# -eq 0 ]
then
npm run build
else
npm run build -- $*
fi
}
第一个错误是,$*
在使用的时候最好放在双引号里面括起来"$*"
,可以减少一些转义的错误。
第二个错误需要点篇幅。"$*"
和 "$@"
这两个变量表示的都是除命令之外的所有参数。但是有一个明显的不同是,"$@"
的值还是一个参数列表,而"$*"
则会变成一个参数。用 node.js 的伪代码翻译下。
// 注意看第二个参数
// $@
spawn('cmd', ['argv1', 'argv2'])
// $*
spawn('cmd', ['argv1 argv2'])
所以大多数情况下,优先使用 "$@"
是一个正确的选择。大家如果要看看实际的例子就是去本地 node_modules/.bin
目录随便查看一个命令文件,比如 umi
你就发现它用就是 "$@"
而且的用了双引号。(和学霸对下答案,发现自己是不是进步了啊?)
if [ -x "$basedir/node" ]; then
exec "$basedir/node" "$basedir/../umi/bin/umi.js" "$@"
else
exec node "$basedir/../umi/bin/umi.js" "$@"
fi
正文
开始说今天的技巧,上次说了做了 r
别名来代替 npm run
, 但是有一个问题是,r
在使用的时候是没有任何提示的;作为一个懒惰的CLI 用户是不允许的。为了有提示,做以下步骤:
1. 安装 https://github.com/cykerway/complete-alias 到
PATH
路径2. 然后增加 alias complete 的配置
举例:
alias r="npm run"
complete -F _complete_alias r
在用 r
命令的时候两下 tab
就有提示了。
还没有结束
如果你配置一个别名,既能有自动提示,也要有一些简单判断逻辑怎么办?上一篇文章不是刚说,alias 没有逻辑判断能力,才去定义fuction
的啊,怎么现在又既要也要了。我们先把问题在具象点,比如我想给 git
做一个别名 g
, 如果只输入 g
的时候,执行 git status
, 但是使用 g checkout some-branch
又能变成 git checkout some-branc
。
方法很简单, 看下面的注释即可。
alias g="git"
# 定义完 g 是 git 别名后使用 `_complete_alias` 定义好自动补全函数
complete -F _complete_alias g
# 定义一个 bash 函数,为 fn_g, 在这个里面实现判断参数的逻辑
function fn_g {
if [ $# -eq 0 ]
then
git status
else
git "$@"
fi
}
# 最后一个妙招,偷天换日,直接换掉 alias 的别名,
# 这样 g 别名同时有了自动补全的能力,还具有了参数判断的能力。
alias g="fn_g"
一个很小的 shell 技巧,希望大家喜欢。