这是我对此的2美分,它代表了我个人的观点以及对该主题的理解。
- 在函数中使用别名在某种程度上是开发人员的个人偏好。我将添加两种方法之间的一些差异,这也可能考虑到使用别名与函数的个人偏好
- 有时,我想做的大多数事情都可以通过别名本身实现,但只有少数需要采用参数。因此,我没有将别名与函数混合使用,而是将别名与函数本身一起使用
Example:
alias kgps='kubectl get pods --all-namespaces | grep '
这非常有效,我可以搜索我的 kubernetes pod。现在,为了删除这些 pod,我需要在命令之间传递相同的参数,因此我使用内部带有函数的别名
alias kdp="_(){ kubectl get pods --all-namespaces | grep \$1 | awk '{print \$2}' | xargs kubectl delete pod; }; _"
所以我的大部分快捷命令都可以通过aliases
只有少数需要这样的东西我才使用带有函数的别名。
别名与函数
现在我想强调一下别名和函数之间的一些差异
与函数相比,别名可以更轻松地覆盖系统命令
如果我需要覆盖ls
,我可以更轻松地做到这一点alias
alias ls='ls -altrh'
虽然等效的函数如下所示
ls() { command ls -altrh "$@";}
ls() { /bin/ls -altrh "$@";}
别名的目的主要是为了快捷方式
别名主要用于创建快捷命令,而函数则用于很多事情、复杂的命令组合、自动完成、bash 提示
别名更容易管理
Run alias
命令您获取当前活动别名的列表
$ alias
....
vs='vagrant ssh'
vu='vagrant up'
vus='vu && vs'
....
要获取我们需要使用的函数列表declare -f
或另一个类似的命令
$ declare -f | wc -l
8226
$ alias | wc -l
217
现在,如果我发布部分输出declare -f
I get
$ 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
命令给了我一个非常简洁的输出,我可以很容易地看到那里有什么。就我而言,100% 都是快捷命令
系统命令的转义别名和函数语法不同
要转义已定义的别名,您需要在其前面加上前缀\
同时为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
并推广问题中的格式