为什么要创建一个别名来创建函数?

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美分,它代表我的个人观点以及对该主题的理解。

  • 在某种程度上,将别名与函数一起使用是开发人员的个人喜好。我将在两种方法之间添加一些差异,这也可能会解释使用别名vs函数的个人偏好
  • 有时候,我想做的大多数事情都可以使用别名本身,但是只有少数几个需要使用参数。因此,我将别名与函数本身结合使用,而不是将别名与函数混合使用

例:

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并提升问题中的格式

  • 这解释了为什么有些人(恕我直言,错误地)更喜欢别名,但并不是真正将函数包装在别名中的原因。 (2认同)

tri*_*eee 6

我找到了一个有关相关主题的Ask Ask Ubuntu问题,其中的一个回答声称这是对另一种设计原则的误解:为函数提供一个长而描述性的名称,并为方便起见创建一个较短的别名。

这仍然无法解释为什么每次使用别名都要重新声明该功能。

  • 有一点说,别名比功能具有更高的优先级。那么也许有所不同?只是一个猜测,但会深情地了解完整的解释。 (2认同)

Let*_*ety 5

我发现这个https://unix.stackexchange.com/questions/30925/in-bash-when-to-alias-when-to-script-and-when-to-write-a-function/233751#233751这解释在别名中定义函数的好处。

这样做比声明一个函数的好处在于,别名不能简单地通过源代码(或使用.)一个恰好声明同名函数的脚本来覆盖。