如何在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命令。
警报别名
顺便说一句,以便我们知道它的作用,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
我们会非常有用地提醒每个命令是什么类型的命令,以及它们的定义。