我想知道 bash shell 中别名和函数之间的区别 - 以及何时使用哪一个。
显然,由于函数可以接受参数,因此它们的功能更加强大 - 因为我主要在路上使用上网本工作,并且想节省能源和处理能力,所以我特别想进一步了解这两种扩展 bash 功能的方式的性能差异。
答案1
考虑到别名作为昵称。您可能有一个经常执行的命令,但想将其缩短。
举个例子,你经常想在命令行中直接进入桌面,因此你可以这样做
alias desktop="cd ~/Desktop"
从那时起你只需输入
desktop
在终端中它将cd ~/Desktop
为您执行。
功能包含逻辑。在一个函数中,你可能会调用几个不同的程序。这是一个简单的 echo 函数
function e {
echo $1
echo $1 $1
echo $1 $1 $1
}
虽然当你调用它时它可能看起来类似于别名
e Hello
您的 e() 可以产生很多不同的事情。以上是一个简单的例子。
别名应该保留用于简单的用例。个人示例 - 我已经rm
像这样替换了我的命令
alias rm='trash-put'
每当我执行 rm 时,它都会将其发送到垃圾箱而不是从磁盘中删除。这迎合了我在终端上的笨拙,我可能(有时)不小心删除了重要文件。
功能,你需要记住,是逻辑的一部分。通常,你不会单独使用函数。它将是更大脚本的一部分。想象一下一个脚本,它将获取你所有的文件并将它们重命名为 pig latin 版本。忽略有多种不同的方法可以做到这一点。
但是您可以循环遍历目录中的每个文件并将文件路径传递给 RenameAsPigLatin 函数。RenameAsPigLatin 函数可能包含涉及数字的额外逻辑,您可以决定不应重命名以数字结尾的文件。
您可以立即看到将其作为函数的好处。该函数可以专注于按照您的奇怪规则进行重命名,而脚本的其余部分可以根据需要遍历各个目录。
答案2
别名是控制台中使用的简单快捷方式,以避免输入长命令或始终重复相同的选项。
一个典型的例子是:
alias ll='ls -l'
默认情况下,别名仅适用于交互式控制台。它们不适用于脚本,但如果您需要这样做,您可以将其添加shopt -s expand_aliases
到脚本中以启用别名扩展。
函数可以在脚本中或控制台中使用,但在脚本中更常用。
与别名(仅被其值替换)相反,函数将由 bash shell 解释。
函数比别名强大得多。它们可用于构建非常复杂的程序。
答案3
除了已经说过的内容之外,函数的管道效果也比别名更好,因为使用别名会将您锁定在别名定义的内容中(除非引用)。我有几个独立的别名,我在特定于任务的管道命令中调用它们,如果它们是别名,调用起来会困难得多。此外,函数允许您为手头的任务全局或本地设置变量。