实用 Bash 别名和函数简介

简介

您在命令行上操作的次数越多,就越会发现您使用的大多数命令只是可用命令的一个非常小的子集。大多数任务都是习惯性的,你可能每天都会以同样的方式运行这些任务。

尽管许多最常见的命令实用程序的制造商试图通过使用缩写名称来消除多余的输入(想想您每天通过键入),但这些并不普遍。此外,许多人每次运行命令时总是启用相同的几个选项。

幸运的是,bash允许我们通过使用别名和外壳函数来创建自己的快捷方式和省时方法。在本指南中,我们将讨论如何利用这些工具,并提供一些有用的示例来帮助您开始正确的方向。

如何声明Bash别名

在bash中声明别名非常简单。这太容易了,你现在应该试一试。

只需在命令行中键入别名,就可以声明在您的Shell会话期间持续的别名。语法如下所示:

1alias alias_name="command_to_run"

请注意,相邻元素之间没有间距,等号。 这不是可选的。 此处的空格将中断命令。

现在让我们创建一个通用的bash别名。许多人经常使用的一个惯用命令短语是ls-lhals-lhA(第二个短语省略了当前目录和父目录列表)。我们可以通过输入以下命令来创建一个可以称为ll的快捷方式:

1alias ll="ls -lhA"

现在,我们可以输入ll,我们将获得当前目录的长格式列表,包括隐藏目录:

1ll

1-rw-r--r-- 1 root root 3.0K Mar 20 18:03 .bash_history
2-rw-r--r-- 1 root root 3.1K Apr 19 2012 .bashrc
3drwx------ 2 root root 4.0K Oct 24 14:45 .cache
4drwx------ 2 root root 4.0K Mar 20 18:00 .gnupg
5-rw-r--r-- 1 root root 0 Oct 24 17:03 .mysql_history
6-rw-r--r-- 1 root root 140 Apr 19 2012 .profile
7drwx------ 2 root root 4.0K Oct 24 14:21 .ssh
8-rw------- 1 root root 3.5K Mar 20 17:24 .viminfo

如果您想去掉别名,只需使用unalias命令:

1unalias ll

别名现在已删除。

您可以通过不带任何参数传递alias命令来列出您配置的所有别名:

1alias

要临时绕过别名(假设我们将ls别名为ls-a),我们可以键入:

1\ls

这将调用PATH中的普通命令,而不使用别名版本。

假设您没有取消设置,ll别名将在整个当前的外壳会话中可用,但当您打开一个新的终端窗口时,该别名将不可用。

要使其持久化,我们需要将其添加到当外壳会话开始时读取的各种文件之一中。常用的选择有~/.bashrc~/.bash_profile。我们只需打开文件并在其中添加别名:

1nano ~/.bashrc

在底部或您想要的任何位置,添加您在命令行中添加的别名。可以随意添加一条评论,声明整个部分都是关于bash别名的:

1#########
2# Aliases
3#########
4
5alias ll="ls -lhA"

此别名或变体实际上可能已经存在于您的文件中。许多发行版都附带了一组标准的bash配置文件,其中包含一些有用的别名。

保存并关闭该文件。您添加的任何别名将在下次启动新的外壳会话时可用。要将您在文件中所做的任何更改读取到您的_Current_Session中,只需告诉bash立即重新读取该文件:

1source ~/.bashrc

别名示例

现在您已经知道如何创建自己的别名,让我们来讨论一些可能对您有用的常用别名。 这些可以在整个网站上找到,有些也可能包含在您的发行版的默认bash配置中。

导航和列表

当您应用一些格式和选项时,许多最简单的Linux命令会更有帮助。

我们讨论了上面的一个例子,但你还可以找到很多其他的例子。

默认情况下,ls按列显示,并带有文件类型指示符(以/等结尾的目录):

1alias ls="ls -CF"

我们还可以预料到一些拼写错误,以使其调用正确的命令:

1alias sl="ls"

我们还创建一个别名,将我们的输出输送到less,以查看长格式的大型目录清单:

1alias lsl="ls -lhFA | less"

不如我们从ls开始,为cd尝试一些有用的命令。

这一个将更改为您的父目录,即使您忘记了空间:

1alias cd..="cd .."

您也可以通过为..做别名来完全删掉cd部分:

1alias ..="cd .."

通过设置此别名,我们可以轻松地在当前目录中查找文件:

1alias fhere="find . -name "

系统别名为

我们的一些监控和系统统计命令怎么样?我每次都用相同的选项调用它们,所以我不妨做一些别名。

这将以人类可读的单位列出我们的磁盘使用情况,包括文件系统类型,并在底部打印总计:

1alias df="df -Tha --total"

我们也可以为首选的du输出添加一个别名:

1alias du="du -ach | sort -h"

让我们继续朝着同一个方向前进,让我们的免费输出更加人性化:

1alias free="free -mt"

我们可以用我们的上市流程表做很多事情。让我们从设置默认输出开始:

1alias ps="ps auxf"

让我们的进程表可搜索怎么样。 我们可以创建一个别名来搜索我们要传递的参数:

1alias psg="ps aux | grep -v grep | grep -i -e VSZ -e"

现在,当我们用我们正在寻找的进程名作为参数调用它时,我们将得到一个漂亮的,紧凑的输出:

1psg bash

1USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
21001 5227 0.0 0.0 26320 3376 pts/0 Ss 16:29 0:00 bash

其他别名

我们经常使用的mkdir命令的一个常见选项是-p标志,用于创建任何必要的父目录。我们可以将其设置为默认设置:

1alias mkdir="mkdir -p"

我们可能想要在上面添加一个-v标志,以便每次创建目录时都会被告知,这可以帮助我们快速识别是否有一个导致意外目录分支的拼写错误:

1alias mkdir="mkdir -pv"

使用wget从互联网下载文件时,几乎所有情况下都需要传递-c标志,以便在出现问题时继续下载。我们可以使用以下内容进行设置:

1alias wget="wget -c"

我们可以轻松地搜索我们的历史记录,就像使用命令输出的grep一样。这有时比使用CTRL-R进行反向搜索更有用,因为它为您提供了以后执行更复杂的回调的命令编号:

1alias histg="history | grep"

我有几个系统工具,我更喜欢从标准版本升级到更复杂的工具。只有当您下载了所需的实用程序时,这些程序才会起作用,但它们可能非常有用。请记住,这些可能会影响您的其他别名。

这个命令用一个增强的版本取代了传统的top命令,它看起来更直观,并且可以进行排序、搜索和滚动,而不会出现复杂的问题:

1alias top="htop"

以类似的方式,可以下载ncdu命令,它在交互式ncurses显示中显示文件和目录大小,您可以浏览并使用它执行简单的文件操作:

1alias du="ncdu"

还有一个用于df的升级实用程序,称为pydf。它提供彩色输出和基于文本的使用栏。如果我们有此实用程序,我们可以默认使用它:

1alias df="pydf"

当你在使用NAT的路由器后面时,你是否曾经需要从命令行获取你的公共IP地址? 像这样的东西可能很有用:

1alias myip="curl http://ipecho.net/plain; echo"

就我个人而言,我喜欢将我上传的文章图片优化为690px或更小,所以我使用ImageMagick包(sudo apt-get install Imagemagick,如果尚未提供的话),其中包含一个名为mogrify的命令,该命令就是这样做的。我的~/.bashrc文件中有以下命令:

1alias webify="mogrify -resize 690\> *.png"

这将调整当前目录中的所有PNG图像的大小,仅当它们大于690px时。

如果我必须将它们上传到服务器,我可以使用sftp连接并自动切换到特定的目录:

1alias upload="sftp [email protected]</^>:/path/to/upload/directory

Bash函数入门

尽管别名快速且易于实现,但它们的范围非常有限。当您尝试将命令链接在一起时,您会发现不能很好地访问在运行时给出的参数。别名有时也会相当慢,因为它们是在所有函数之后被读取的。

除了别名,还有一种更健壮的替代方法,可以帮助您弥合bash别名和完整的外壳脚本之间的差距。这些被称为外壳函数。它们的工作方式与别名几乎相同,但更具程序性,并以标准方式接受输入。

我们不会在这里深入讨论,因为它们可以在许多复杂的情况下使用,而bash是一种完整的脚本语言,但我们将介绍一些基本的示例。

对于初学者来说,声明bash语法有两种基本方法。第一个命令使用unction命令,如下所示:

1function function_name {
2    command1
3    command2</^>
4}

另一种语法使用了一组更像C语言的圆括号:

1function_name () {
2    command1
3    command2
4}

我们可以将第二种形式压缩成一行,并用分号分隔命令。最后一条命令后也必须有分号:

1function_name () { command1; command2; }

让我们从演示一个非常有用的bash函数开始。这个将创建一个目录,然后立即移到该目录中。这通常正是我们在创建新目录时采用的顺序:

1mcd () {
2    mkdir -p $1
3    cd $1
4}

现在,当我们使用这个函数,而不是常规的mkdir命令,在创建后自动切换到目录:

1mcd test
2pwd

1/home/demouser/test

您将看到的一个很酷的函数是`EXTRACT‘函数。这结合了许多实用程序,使您可以解压缩几乎任何压缩文件格式。有很多种变体,但这一种来自here

 1function extract {
 2 if [ -z "$1" ]; then
 3    # display usage if no parameters given
 4    echo "Usage: extract <path/file_name>.<zip|rar|bz2|gz|tar|tbz2|tgz|Z|7z|xz|ex|tar.bz2|tar.gz|tar.xz>"
 5    echo "       extract <path/file_name_1.ext> [path/file_name_2.ext] [path/file_name_3.ext]"
 6    return 1
 7 else
 8    for n in $@
 9    do
10      if [ -f "$n" ] ; then
11          case "${n%,}" in
12            *.tar.bz2|*.tar.gz|*.tar.xz|*.tbz2|*.tgz|*.txz|*.tar) 
13                         tar xvf "$n"       ;;
14            *.lzma)      unlzma ./"$n"      ;;
15            *.bz2)       bunzip2 ./"$n"     ;;
16            *.rar)       unrar x -ad ./"$n" ;;
17            *.gz)        gunzip ./"$n"      ;;
18            *.zip)       unzip ./"$n"       ;;
19            *.z)         uncompress ./"$n"  ;;
20            *.7z|*.arj|*.cab|*.chm|*.deb|*.dmg|*.iso|*.lzh|*.msi|*.rpm|*.udf|*.wim|*.xar)
21                         7z x ./"$n"        ;;
22            *.xz)        unxz ./"$n"        ;;
23            *.exe)       cabextract ./"$n"  ;;
24            *)
25                         echo "extract: '$n' - unknown archive method"
26                         return 1
27                         ;;
28          esac
29      else
30          echo "'$n' - file does not exist"
31          return 1
32      fi
33    done
34fi
35}

此函数接受第一个参数,并根据使用的文件扩展名调用相应的实用程序。

结论

希望本指南能启发您创建自己的别名和bash函数。广泛使用这些工具可以帮助您在外壳中度过更愉快、更简单的时光。

请记住,在使用可能具有破坏性的行为重新定义现有命令时要格外小心。即使做相反的操作,并将命令别名为更安全的变体(例如,在递归删除之前总是要求确认),当您第一次使用没有它的系统时,一旦您开始依赖它,就会回来咬您。

要找到可能适合为其创建别名的候选人,在您的历史记录中搜索最常用的命令可能是一个好主意。here的一行程序允许我们查看最常用的命令:

1history | 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 -n10

 11	247 24.7%  cd
 2 2	112 11.2%  vim
 3 3	90 9%     exit
 4 4	72 7.2%   ls
 5 5	70 7%     xset
 6 6	56 5.6%   apt-get
 7 7	40 4%     vlc
 8 8	40 4%     rm
 9 9	38 3.8%   screen
1010	27 2.7%   htop

我们可以很容易地将此列表用作我们经常使用的命令的起点。在评论部分,您可以随意分享您最喜欢的bash别名和函数:

By Justin Ellingwood
Published At
Categories with 技术
Tagged with
comments powered by Disqus