如何在Linux上创建别名和Shell函数

使用别名和Bash shell函数创建您自己的Linux命令。驯服重复性任务,截断冗长的过程,并使用您经常使用且难以记住的选项配置标准命令。

别名和shell脚本是Linux和类Unix操作系统中的强大技术,允许您磨练您的命令行体验以满足您的需要。您可以定义适合您特定需要的自己的命令,以减轻重复性任务的负担。

别名和shell脚本执行相同的工作。它们允许您定义和命名一组Bash shell功能,然后可以根据您为其指定的名称进行调用。与每次要使用所有步骤或命令相比,键入名称更容易、更方便。

别名和脚本之间的区别在于复杂性和规模。脚本更善于保存更长、更精细的代码块。别名非常适合保存更短、更简洁的命令集。

预定义别名

某些别名是为您预定义的。要查看系统中定义的别名列表,请使用不带参数的alias命令:

alias

这些是本文研究的Ubuntu测试机上定义的别名。如果我定义了任何自定义别名,这些也会出现在这个列表中。

在列表的顶部,有一个看起来很复杂的别名,名为alert。我们稍后会谈到这一点。ls命令有一组不同的别名,还有一组别名为grep命令系列提供颜色输出。例如,定义了这些别名后,无论何时键入:

grep

系统会将其解释为:

grep --color=auto

这显示了别名的一个重要问题。它们可以与现有命令同名,甚至可以在其内部包含原始命令。

下面是grep别名的定义。

alias grep='grep --color=auto'

ALIAS命令用于定义别名。 接下来给出别名的名称。在本例中,它是grep。 等号将别名的名称连接到别名的正文。对于除非常简单的别名之外的所有别名,别名的主体都用单引号括起来。 别名的主体是在命令行上使用别名时执行的部分。

该别名的主体只调用带有--color=auto选项的*grep命令。

警报别名

顺便说一句,为了让您知道它的作用,警报别名用于让您知道命令何时完成。它还指示命令是否成功完成。它在屏幕顶部提供图形系统警报。

这里有一个简单的例子。睡眠命令将休眠5秒钟,然后将调用警报别名。别名检查来自上一个命令的响应。它从历史文件中提取最后一个命令。它确定命令是否成功完成。然后,它会在系统警报中显示结果。

如果命令按预期完成,则系统警报中的图标是一个小终端窗口。如果命令返回错误代码,则系统警报中的图标为红色错误图标。

sleep 5; alert

五秒钟后,我们会看到此系统警报:

该图标是一个小的终端窗口,意味着一切都进行得很顺利。让我们用一个我们知道会失败的命令再试一次:

DoomedToFail; alert

我们的系统警报现在有一个错误图标。

定义微不足道的别名

正如我们已经看到的,要定义别名,我们使用alias命令。

我们将为CLEAR命令创建一个假名。我们的别名将称为cls,它将调用Clear命令。

我们的别名定义非常琐碎,不需要用单引号括起来。如果别名的主体比这个复杂,或者如果它包含空格,请用单引号将其引起来。我们将定义别名,使用ls将一些输出放入终端窗口,然后使用我们的新别名cls清除屏幕。

alias cls=clearls -lcls

屏幕被清除了。成功了,尽管是短暂的。只有在此终端窗口保持打开状态时,别名才会继续存在。一旦窗口关闭,别名就会消失。

那么我们如何让我们的别名永久化呢?

.bashrc文件和别名

您可能想知道预打包的别名是在哪里定义的。它位于主文件夹的“.bashrc”文件中。每当启动交互式shell时,都会读取该文件,并执行其中的命令。也就是说,当您打开终端窗口时。

在您的主文件夹中键入以下命令,查看语法突出显示的“.bashrc”文件的内容。

gedit .bashrc

这将启动Gedit编辑器,其中加载了“.bashrc”文件。

高亮显示的区域显示了定义别名的两个区域。

滚动文档将显示与别名相关的另外两个部分:

第一个是警报别名的定义。第二个是if语句。它转换为“如果文件”.bash_aliases“存在,请将其读入。”

如果您只想定义几个别名,可以将它们放入“.bashrc”文件中。将它们塞到包含ls别名的部分下面。

如果您要创建许多别名,或者您只是喜欢将别名封装在它们自己的文件中,您可以在“.bash_aliases”文件中定义它们。在“.bash_aliases”文件中创建它们的一个好处是,您不会意外更改“.bashrc”文件中的任何设置。另一个优点是您的别名很容易复制到新系统,因为它们与“.bashrc”文件完全分离。

在.bash_aliases文件中存储别名

“.bash_aliases”文件只有在您创建后才会存在。*您可以使用以下命令创建该文件:

touch .bash_aliases

让我们编辑该文件并为其添加几个别名。此命令将在Gedit编辑器中打开“.bash_aliases”文件。

gedit .bash_aliases

我们增加了三个别名。第一个是我们之前使用的CLS别名。下一个称为h,是调用历史命令的一种快捷方式。

第三个别名称为FTC。这代表“文件类型计数”。

这个别名比较复杂,所以用单引号括起来。它使用通过管道链接在一起的一系列命令。它生成不同文件扩展名和目录名的排序列表,每个列表条目都有计数。

相关:如何在Linux上使用管道

当我们保存了“.bash_aliases”文件时,我们可能希望我们的别名是活动的并且可以访问。事实并非如此。在别名定义生效之前,文件必须由Bash shell读入。每当打开交互式外壳时,都会执行此操作。

我们还可以使用内置的Bash shell。读取并执行文件中的命令。因为我们的“.bash_alias”文件是在处理“.bashrc”时读入的,所以我们应该通过调用“.bashrc”来执行测试。这样,我们就可以检查“.bash_alias”文件是否从“.bashrc”调用,以及我们的别名是否处于活动状态。

我们使用的命令包括:

gedit .bash_alias

编辑“.bash_alias”文件。

. .bashrc

这将读入并执行“.bashrc”中的命令,该命令将调用“.bash_alias”。

ftc

这将调用FTC别名。

我们的别名会响应,这意味着Bash已经读取了“.bashrc”和“.bash_aliases”,我们的新别名现在可以使用了。

现在,您可以继续向“.bash_aliases”文件添加新别名。如果你发现自己做了一两次以上的事情,可以考虑给它取个别名。

删除别名

有一个命令可以删除别名,这样Bash就不会识别它们,也不会响应它们。令人耳目一新的直截了当的命令被称为unalias。

要使用它,请给出您希望让Bash忘记的别名的名称。要让Bash忘记我们的FTC别名,请按如下方式使用unalias:

unalias ftc

您可以使用unalias删除已定义的别名和任何预定义的别名。

要从系统中删除所有别名,请使用-a(All)选项:

unalias -a

不过,巴什的记忆力丧失不会是永久性的。下次打开终端窗口时,“被遗忘”的别名将会回来。要真正清除它们,您需要从“.bashrc”和“.bash_alias”文件中删除它们。

如果您想要回它们,不要从您的“.bashrc”文件中删除它们。相反,可以通过在每个别名行的开头添加散列#将其注释掉。要使“.bash_alias”文件无效,请将其重命名。如果您的“.bashrc”文件看不到它,它就不会读取它。逆转这些步骤以恢复您的别名是一件微不足道的事情。

外壳函数

Lika别名、Bash shell函数可以在“.bashrc”文件中定义,但通常将它们放在自己的定义文件中会更整洁。按照“.bash_aliases”文件使用的约定,我们将其命名为“.bash_Functions”。

这意味着我们需要告诉“.bashrc”文件读取我们的定义。我们可以复制和修改读取“.bash_aliases”文件的代码片段。启动Gedit并使用以下命令加载“.bashrc”文件:

gedit .bashrc

您需要添加如下所示的突出显示部分。

您可以高亮显示别名部分并按Ctrl+C,然后移动到想要创建新部分的位置,然后按Ctrl+V粘贴文本的副本。然后,您需要做的就是将显示为“.bash_aliases”的两个位置更改为“.bash_Functions”。

我们可以保存这些更改并关闭Gedit。

现在,我们将创建并编辑“.bash_Functions”文件,并将函数定义放入其中。

touch .bash_functionsgedit .bash_functions

这将在Gedit中打开空的“.bash_function”文件。

我们将添加一个名为up的简单函数。UP将接受单个命令行参数,该参数是一个数字。UP然后将呼叫CD..。这个次数。因此,如果您使用命令

up 2

UP会呼叫CD..。两次,并且将在目录树中向上移动两级。

定义函数有不同的方式。这里有一个:

function up() {

单词功能是可选的。如果你是个传统主义者,那就用它,如果你懒得输入,就省略吧。

以下是我们在Gedit中的整个函数:

function up() {

这标志着函数定义的开始,它将函数命名为up。

levels=$1

这将创建一个名为LELES的变量,并将其设置为第一个参数的值。此参数将是用户调用函数时提供的数字。$1表示“第一个命令行参数”。

while [ "$levels" -gt "0" ]; do

然后我们进入一个循环。这可以翻译为“当级别的值大于零时,执行循环体中包含的操作。”

在循环体内部,我们有两个命令。它们是:

cd ..

在目录树中上移一级。

levels=$(($levels - 1))

将级别设置为一个新值,该值比其当前值小一。

然后我们返回到循环的顶部,再次比较Level和0之间的值。如果级别大于零,则再次执行循环体。如果不大于零,则循环结束,我们跳转到Done语句,函数结束。

保存这些更改并关闭Gedit。

我们将读入并执行“.bashrc”中的命令,该命令应读入并执行“.bash_Functions”文件中的命令。

. .bashrc

我们可以通过移动到目录树中的某个位置并使用Up移回目录树中的“更高”点来测试该功能。

cd ./work/backup/up 2

该函数起作用。我们在树中将目录级别上移了两级。

跟踪类型

当您构建一套别名和函数库时,可能很难记住特定命令是别名还是函数。您可以使用type命令来提醒您。这里最酷的是,您还可以看到定义。

让我们对FTC别名和up函数使用type。

type ftctype up

我们得到一个非常有用的提示,告诉我们每个命令是什么类型,以及它们的定义。

开始收集

别名和函数可以极大地加快命令行的使用速度。它们可以缩短命令序列,并允许您烘焙始终与标准命令一起使用的选项。

每次看到漂亮的一行程序或有用的函数时,都可以对其进行调整和个性化,然后将其添加到“.bash_aliases”或“.bash_function”文件中。

相关文章