有用的Bash别名和函数简介

来自菜鸟教程
跳转至:导航、​搜索

介绍

您在命令行上操作的越多,您就越会发现您使用的大多数命令只是可用命令的一小部分。 大多数任务是习惯性的,您可能每天都以相同的方式运行这些任务。

尽管许多最常见的命令实用程序的制造商都试图通过使用缩短的名称来消除多余的输入(想想你每天通过输入“ls”而不是“list”和“cd”而不是“change-directory”来节省多少击键”),这些并不普遍。 此外,许多人每次运行命令时总是启用相同的几个选项。

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

如何声明 Bash 别名

在 bash 中声明别名非常简单。 这很容易,您现在应该尝试一下。

您只需在命令行中键入这些别名,即可声明与您的 shell 会话一样长的别名。 语法如下所示:

alias alias_name="command_to_run"

请注意,相邻元素和等号之间没有间距。 这不是可选的。 这里的空格会破坏命令。

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

alias ll="ls -lhA"

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

ll

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

如果您想摆脱别名,只需使用 unalias 命令:

unalias ll

现在已删除别名。

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

alias

要暂时绕过别名(比如我们将 ls 别名为 ls -a),我们可以输入:

\ls

这将调用在我们的路径中找到的正常命令,而不使用别名版本。

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

为了使其持久化,我们需要将其添加到 shell 会话开始时读取的各种文件之一中。 流行的选择是 ~/.bashrc~/.bash_profile。 我们只需要打开文件并在其中添加别名:

nano ~/.bashrc

在底部或您想要的任何位置,添加您在命令行中添加的别名。 随意添加评论声明整个部分专门用于 bash 别名:

#########
# Aliases
#########

alias ll="ls -lhA"

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

保存并关闭文件。 您添加的任何别名都将在您下次启动新的 shell 会话时可用。 要将您在文件中所做的任何更改读入 current 会话,只需告诉 bash 现在重新读取文件:

source ~/.bashrc

别名示例

既然您知道如何创建自己的别名,那么让我们谈谈一些可能对您有用的流行别名。 这些可以在整个网络中找到,有些也可能包含在您的发行版的默认 bash 配置中。

导航和列表

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

我们在上面讨论了一个 ls 示例,但您可能会发现许多其他示例。

默认情况下,使 ls 显示在列中并带有文件类型指示符(以“/”等结束目录):

alias ls="ls -CF"

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

alias sl="ls"

让我们也创建一个别名来将我们的输出通过管道传输到 less 以查看具有长格式的大型目录列表:

alias lsl="ls -lhFA | less"

我们离开 ls 并尝试一些对 cd 有用的命令怎么样。

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

alias cd..="cd .."

您还可以通过为 .. 创建别名来完全删除 cd 部分:

alias ..="cd .."

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

alias fhere="find . -name "

系统别名

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

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

alias df="df -Tha --total"

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

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

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

alias free="free -mt"

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

alias ps="ps auxf"

我们如何让我们的进程表可搜索。 我们可以创建一个别名,在我们的进程中搜索我们将传递的参数:

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

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

psg bash

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

杂项别名

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

alias mkdir="mkdir -p"

我们可能想在上面添加一个 -v 标志,这样我们就会被告知每个目录创建,如果我们有一个导致意外目录分支的错字,这可以帮助我们快速识别:

alias mkdir="mkdir -pv"

当使用 wget 从 Internet 下载文件时,几乎在所有情况下,您都需要传递 -c 标志以便在出现问题时继续下载。 我们可以这样设置:

alias wget="wget -c"

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

alias histg="history | grep"

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

这个命令用增强版替换了传统的 top 命令,该版本更易于使用,并且可以轻松排序、搜索和滚动:

alias top="htop"

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

alias du="ncdu"

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

alias df="pydf"

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

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

出于我自己的目的,我喜欢将我上传的文章图片优化为 690 像素或更小,所以我使用 ImageMagick 包(如果尚不可用,则为 sudo apt-get install imagemagick),其中包含一个名为 mogrify 的命令就是这样做的。 我的 ~/.bashrc 文件中有这个命令:

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

这将调整当前目录中所有 PNG 图像的大小,前提是它们的宽度大于 690 像素。

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

alias upload="sftp username@server.com</^>:/path/to/upload/directory<^>

开始使用 Bash 函数

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

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

我们不会在这里详细介绍,因为这些可以用于很多复杂的情况,而且 bash 是一门完整的脚本语言,但我们将介绍一些基本示例。

对于初学者,有两种基本的方式来声明 bash 语法。 第一个使用 function 命令,看起来像这样:

function function_name {
    command1
    <^>command2</^>
}

另一种语法使用一组更“类似 C”的括号:

function_name () {
    command1
    command2
}

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

function_name () { command1; command2; }

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

mcd () {
    mkdir -p $1
    cd $1
}

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

mcd test
pwd

/home/demouser/test

您将看到的一个很酷的功能是 extract 功能。 这结合了许多实用程序,允许您解压缩几乎任何压缩文件格式。 有许多变体,但这个来自 here

function extract {
 if [ -z "$1" ]; then
    # display usage if no parameters given
    echo "Usage: extract <path/file_name>.<zip|rar|bz2|gz|tar|tbz2|tgz|Z|7z|xz|ex|tar.bz2|tar.gz|tar.xz>"
    echo "       extract <path/file_name_1.ext> [path/file_name_2.ext] [path/file_name_3.ext]"
    return 1
 else
    for n in $@
    do
      if [ -f "$n" ] ; then
          case "${n%,}" in
            *.tar.bz2|*.tar.gz|*.tar.xz|*.tbz2|*.tgz|*.txz|*.tar) 
                         tar xvf "$n"       ;;
            *.lzma)      unlzma ./"$n"      ;;
            *.bz2)       bunzip2 ./"$n"     ;;
            *.rar)       unrar x -ad ./"$n" ;;
            *.gz)        gunzip ./"$n"      ;;
            *.zip)       unzip ./"$n"       ;;
            *.z)         uncompress ./"$n"  ;;
            *.7z|*.arj|*.cab|*.chm|*.deb|*.dmg|*.iso|*.lzh|*.msi|*.rpm|*.udf|*.wim|*.xar)
                         7z x ./"$n"        ;;
            *.xz)        unxz ./"$n"        ;;
            *.exe)       cabextract ./"$n"  ;;
            *)
                         echo "extract: '$n' - unknown archive method"
                         return 1
                         ;;
          esac
      else
          echo "'$n' - file does not exist"
          return 1
      fi
    done
fi
}

此函数采用第一个参数并根据使用的文件扩展名调用适当的实用程序。

结论

希望本指南为您创建自己的别名和 bash 函数提供了一些灵感。 广泛使用这些可以帮助您在 shell 中的时间更愉快,更简单。

请记住,不要使用具有潜在破坏性的行为重新定义现有命令。 即使做相反的事情并将命令别名为更安全的变体(例如,在递归删除之前总是要求确认),一旦你开始依赖它,当你第一次进入没有它的系统时,它也会回来咬你.

要找到可能适合为其创建别名的候选者,最好在历史记录中搜索最常用的命令。 来自 here 的一行代码让我们可以看到我们最常用的命令:

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

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

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

贾斯汀·艾林伍德