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

时间:2020-01-09 10:39:04  来源:igfitidea点击:

使用别名和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命令。

警报别名

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

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

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

sleep 5; alert

五秒钟后,我们看到以下系统警报:

该图标是一个小的终端窗口,表示一切正常。让我们用已知会失败的命令再试一次:

DoomedToFail; alert

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

定义琐碎的别名

如我们所见,要定义别名,我们使用alias命令。

我们将为" clear"命令创建一个化名。我们的别名将称为" cls",并将称为" clear"命令。

我们的别名定义是如此琐碎,以至于不能保证将其用单引号引起来。如果别名的内容比这更复杂,或者它包含空格,则将其用单引号引起来。我们将定义别名,使用ls在终端窗口中放置一些输出,然后使用我们的新别名cls清除屏幕。

alias cls=clear
ls -l
cls

屏幕被清除。成功,尽管寿命很短。只要该终端窗口保持打开状态,别名将一直存在。窗口关闭后,别名将消失。

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

.bashrc文件和别名

我们可能想知道预包装别名的定义位置。它位于主文件夹中的.bashrc文件中。每当启动交互式shell程序时,都会读取该文件并执行其中的命令。即,当我们打开终端窗口时。

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

gedit .bashrc

这将启动加载了.bashrc文件的gedit编辑器。

突出显示的区域显示了两个定义了别名的区域。

在文档中滚动将显示与别名相关的其他两个部分:

首先是" alert"别名的定义。第二个是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。",是调用" history"命令的简写方式。

第三个别名称为" ftc"。这代表文件类型计数。

此别名涉及更多,因此用单引号引起来。它使用通过管道链接在一起的命令链。它生成一个不同文件扩展名和目录名称的排序列表,并对每个列表条目进行计数。

保存.bash_aliases文件后,我们可能希望别名能够生效并且可以访问。事实并非如此。在别名定义生效之前,必须由Bash shell读取该文件。只要打开交互式shell,就会完成此操作。

我们还可以使用Bash shell内置的.来读取和执行文件中的命令。因为处理.bashrc时会读取我们的.bash_alias文件,所以我们应该通过调用.bashrc来执行测试。这样,我们可以检查是否从.bashrc调用了.bash_alias文件,并且我们的别名是否有效。

我们使用的命令是:

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(全部)选项:

unalias -a

但是,Bash的内存丢失不会是永久的。下次打开终端窗口时,被忘记的别名将返回。要真正清除它们,我们需要从.bashrc和.bash_alias文件中删除它们。

如果我们想恢复它们,请不要从.bashrc文件中删除它们。相反,通过在每条" alias"行的开头添加井号"#"来注释掉它们。要使.bash_alias文件无效,请对其进行重命名。如果.bashrc文件看不到它,则它将无法读取它。逆转这些步骤以恢复别名是一件小事。

shell功能

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_functions
gedit .bash_functions

这将在gedit中打开空的.bash_functions文件。

我们将添加一个名为up的简单函数。 " up"将使用单个命令行参数,该参数是一个数字。然后,up将调用cd..`的次数。因此,如果我们使用了命令

up 2

" up"将调用" cd .."两次,并将在目录树中上移两个级别。

定义函数有多种方法。这是一个:

function up() {

"功能"一词是可选的。如果我们是传统主义者,请使用它,如果我们不必打扰它,请不要使用它。

这是我们在gedit中的全部功能:

function up() {

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

levels=

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

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

然后,我们进入一个循环。这意味着"水平"的值大于零时,请执行循环主体中包含的内容。

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

cd ..

在目录树中上移一个级别。

levels=$(($levels - 1))

将"水平"设置为新值,该值比当前值小一。

然后,我们回到循环的顶部,再次对" levels"的值和零进行比较。如果" levels"大于零,则再次执行循环的主体。如果它不大于零,则循环结束,然后进入" done"语句,函数结束。

保存这些更改并关闭" gedit"。

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

. .bashrc

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

cd ./work/backup/
up 2

该功能起作用。我们在树中移动了两个目录级别。

跟踪类型

在建立一组别名和函数库时,很难记住特定命令是别名还是函数。我们可以使用type命令来提醒我们。这里很酷的事情是我们还可以看到定义。

让我们在ftc别名和up函数上使用type

type ftc
type up

我们会非常有用地提醒每个命令是什么类型的命令,以及它们的定义。