以下是我的个人意见和对这个话题的理解。在使用别名和函数时,有一定程度上是开发者个人喜好的问题。我将添加一些两种方法之间的区别,这也可能影响使用别名与函数的个人偏好。
有时候,大部分我想做的事情都可以使用别名来完成,但只有少数需要使用参数。因此,我会使用别名与函数本身结合起来。
例如:
alias kgps='kubectl get pods --all-namespaces | grep '
这很好用,我可以搜索我的kubernetes pods。现在要删除这些pods,我需要在命令之间传递相同的参数,所以我使用一个包含函数的别名。
alias kdp="_(){ kubectl get pods --all-namespaces | grep \$1 | awk '{print \$2}' | xargs kubectl delete pod; }; _"
我的大多数快捷键命令都可以通过别名(aliases)
执行,只有少数需要这些东西的命令我才会使用别名与函数结合。
别名 vs 函数
现在,我想强调一下别名和函数之间的几个区别:
与函数相比,别名更容易覆盖系统命令
如果我需要覆盖 ls
命令,我可以更轻松地使用 别名(alias)
实现。
alias ls='ls -altrh'
相应的函数代码如下:
ls() { command ls -altrh "$@";}
ls() { /bin/ls -altrh "$@";}
别名通常用于创建快捷方式
别名主要用于创建快捷命令,而函数则用于许多其他方面,如复杂命令组合、自动补全和Bash提示。
别名更易管理
运行alias
命令即可获取当前活动别名列表。
$ alias
....
vs='vagrant ssh'
vu='vagrant up'
vus='vu && vs'
....
为了获取我们需要使用的函数列表,我们需要使用
declare -f
或其他类似的命令。
$ declare -f | wc -l
8226
$ alias | wc -l
217
现在,如果我发布
declare -f
的部分输出结果如下:
$ declare -f
...
vi_mode_prompt_info () {
return 1
}
virtualenv_prompt_info () {
return 1
}
work_in_progress () {
if $(git log -n 1 2>/dev/null | grep -q -c "\-\-wip\-\-")
then
echo "WIP!!"
fi
}
zle-line-finish () {
echoti rmkx
}
zle-line-init () {
echoti smkx
}
zsh_stats () {
fc -l 1 | awk '{CMD[$2]++;count++;}END { for (a in CMD)print CMD[a] " " CMD[a]/count*100 "% " a;}' | grep -v "./" | column -c3 -s " " -t | sort -nr | nl | head -n20
}
您可以看到有许多与我无关的函数被使用。但是,alias
命令给出了非常简洁的输出,我可以轻松地看到所有内容。在我的情况下,它们全部都是快捷命令。
转义别名和函数的语法对系统命令有所不同
要转义定义的别名,您需要在前面加上 \
,而对于 functions
,您需要使用 command <originalcommand>
或者命令的绝对路径 /bin/originalcommand
别名比函数优先级更高
请查看以下示例
alias ls='echo alias && ls'
$ ls() { /bin/ls -al }
alias
$ ls
alias
total 23173440
drwxrwxr-x+ 255 tarunlalwani staff 8160 Jul 30 22:39 .
drwxr-xr-x+ 113 tarunlalwani staff 3616 Jul 30 23:12 ..
...
当我们运行ls
命令时,首先使用别名,然后调用函数中的下一个ls
。这也成为一种使用相同名称包装现有函数并在内部重复使用原始函数的方法,只能使用alias
完成,并促进了问题中的格式。
function
不会引起任何更高的优先级。function f() { echo foo; }; f () { echo bar; }; f
仍然输出bar
,因为第二个函数替换了第一个。 - chepnergit
内部的alias
的技巧。也许有不同的情况,可能有人从中得到了错误的灵感。 - Walter A