tri*_*eee 20 bash shell alias sh
我偶尔会看到这种模式,尤其是在有关Bash提示自定义的问题上。
alias f='_ () { useful code; }; _'
Run Code Online (Sandbox Code Playgroud)
我完全没有理由在此处创建别名。明显的重构
f () { useful code; }
Run Code Online (Sandbox Code Playgroud)
这样就避免了完全声明一个别名,而只是简单地一劳永逸地定义了函数,这看起来更简单,更易理解,不那么脆弱且更高效。(以防万一,每次调用别名时,别名最终都会重新声明该函数。)
例如,使Bash别名带有参数?有几个答案可以证明这种技术。使用ftp路径运行lftp的bash脚本是一个有关此函数内部实际功能的问题,其中包含类似这样的代码,尽管我轻描淡写,OP也不解释为什么。
这是否仅仅是一种反模式,还是有实际的理由这样做?在什么情况下该设计有意义?
这与别名后面没有空格有关,也与代码混淆无关(除了这种神秘的技术之外,我发现的示例通常是完全可读的)。
Tar*_*ani 13
这是我的2美分,它代表我的个人观点以及对该主题的理解。
例:
alias kgps='kubectl get pods --all-namespaces | grep '
Run Code Online (Sandbox Code Playgroud)
这很好用,我可以搜索我的kubernetes吊舱。现在要删除这些Pod,我需要在命令之间传递相同的参数,因此我在内部使用了一个函数别名
alias kdp="_(){ kubectl get pods --all-namespaces | grep \$1 | awk '{print \$2}' | xargs kubectl delete pod; }; _"
Run Code Online (Sandbox Code Playgroud)
因此,我的大多数快捷方式命令都可以执行,aliases
而只有极少数需要执行此类操作的命令我将别名与函数配合使用。
现在,我要强调的是别名和函数之间的区别很小
与功能相比,别名可以更轻松地覆盖系统命令
如果需要覆盖ls
,可以使用以下方法轻松完成alias
alias ls='ls -altrh'
Run Code Online (Sandbox Code Playgroud)
虽然等效的功能如下
ls() { command ls -altrh "$@";}
ls() { /bin/ls -altrh "$@";}
Run Code Online (Sandbox Code Playgroud)
别名的意图主要是为了捷径
别名主要用于创建快捷命令,而功能则用于很多事情,命令的复杂组合,自动完成,bash提示
别名更易于管理
运行alias
命令,您将获得当前活动别名的列表
$ alias
....
vs='vagrant ssh'
vu='vagrant up'
vus='vu && vs'
....
Run Code Online (Sandbox Code Playgroud)
要获取我们需要使用的功能列表declare -f
或其他类似命令
$ declare -f | wc -l
8226
$ alias | wc -l
217
Run Code Online (Sandbox Code Playgroud)
现在,如果我发布的部分输出的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
}
Run Code Online (Sandbox Code Playgroud)
如您所见,有很多功能在使用但与我无关。虽然该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 ..
...
Run Code Online (Sandbox Code Playgroud)
如您所见,当我们运行ls
命令时,首先使用别名,然后使用别名ls
。
这也成为一种使用相同名称包装退出函数并在内部重新使用原始函数的方法,这只能使用alias
并提升问题中的格式
我找到了一个有关相关主题的Ask Ask Ubuntu问题,其中的一个回答声称这是对另一种设计原则的误解:为函数提供一个长而描述性的名称,并为方便起见创建一个较短的别名。
这仍然无法解释为什么每次使用别名都要重新声明该功能。
我发现这个https://unix.stackexchange.com/questions/30925/in-bash-when-to-alias-when-to-script-and-when-to-write-a-function/233751#233751这解释在别名中定义函数的好处。
这样做比声明一个函数的好处在于,别名不能简单地通过源代码(或使用
.
)一个恰好声明同名函数的脚本来覆盖。