Bash 别名是一种使用新命令补充或覆盖 Bash 命令的方法。 Bash 别名使用户可以轻松地在 POSIX 终端中自定义他们的体验。它们通常在 $HOME/.bashrc 或 $HOME/bash_aliases 中定义(必须由 $HOME/.bashrc 加载)。
大多数发行版至少在任何新用户帐户的默认 .bashrc 文件中添加了一些流行的别名。 这些是简单的别名,用于演示 Bash 别名的语法
alias ls='ls -F'
alias ll='ls -lh'
并非所有发行版都附带预填充的别名。如果您手动添加别名,则必须将它们加载到当前的 Bash 会话中
$ source ~/.bashrc
否则,您可以关闭您的终端并重新打开它,以便它重新加载其配置文件。
在您的 Bash 初始化脚本中定义了这些别名之后,您可以键入 ll 并获得 ls -l 的结果,当您键入 ls 时,您将获得而不是普通的 ls 的输出。
这些别名很好,但它们只是揭示了可能性的冰山一角。 这是前 10 个 Bash 别名,一旦您尝试过,您将无法离开它们。
首先设置
在开始之前,创建一个名为 ~/.bash_aliases 的文件
$ touch ~/.bash_aliases
然后,确保此代码出现在您的 ~/.bashrc 文件中
if [ -e $HOME/.bash_aliases ]; then
source $HOME/.bash_aliases
fi
如果您想亲自尝试本文中的任何别名,请将它们输入到您的 .bash_aliases 文件中,然后使用 source ~/.bashrc 命令将它们加载到您的 Bash 会话中。
按文件大小排序
如果您以 GUI 文件管理器(如 GNOME 中的 Nautilus、MacOS 中的 Finder 或 Windows 中的 Explorer)开始您的计算生涯,那么您可能习惯于按文件大小对文件列表进行排序。您也可以在终端中执行此操作,但这并不完全简洁。
在 GNU 系统上将此别名添加到您的配置中
alias lt='ls --human-readable --size -1 -S --classify'
此别名将 lt 替换为 ls 命令,该命令显示每个项目的大小,然后按大小对它们进行排序,在单列中,并使用表示文件类型的符号。 加载您的新别名,然后尝试一下
$ source ~/.bashrc
$ lt
total 344K
140K configure*
44K aclocal.m4
36K LICENSE
32K config.status*
24K Makefile
24K Makefile.in
12K config.log
8.0K README.md
4.0K info.slackermedia.Git-portal.json
4.0K git-portal.spec
4.0K flatpak.path.patch
4.0K Makefile.am*
4.0K dot-gitlab.ci.yml
4.0K configure.ac*
0 autom4te.cache/
0 share/
0 bin/
0 install-sh@
0 compile@
0 missing@
0 COPYING@
在 MacOS 或 BSD 上,ls 命令没有相同的选项,因此可以使用此别名
alias lt='du -sh * | sort -h'
此版本的结果略有不同
$ du -sh * | sort -h
0 compile
0 COPYING
0 install-sh
0 missing
4.0K configure.ac
4.0K dot-gitlab.ci.yml
4.0K flatpak.path.patch
4.0K git-portal.spec
4.0K info.slackermedia.Git-portal.json
4.0K Makefile.am
8.0K README.md
12K config.log
16K bin
24K Makefile
24K Makefile.in
32K config.status
36K LICENSE
44K aclocal.m4
60K share
140K configure
476K autom4te.cache
事实上,即使在 Linux 上,该命令也很有用,因为使用 ls 会将目录和符号链接列为大小为 0,这可能不是您实际想要的信息。 这是你的选择。
感谢 Brad Alexander 提出的这个别名创意。
仅查看已挂载的驱动器
mount 命令曾经非常简单。只需一个命令,您就可以获得计算机上所有已挂载文件系统的列表,并且它经常用于概述工作站连接了哪些驱动器。看到超过三到四个条目曾经令人印象深刻,因为大多数计算机的 USB 端口数量不超过此数量,因此结果是可管理的。
现在的计算机有点复杂了,并且在 LVM、物理驱动器、网络存储和虚拟文件系统之间,mount 的结果可能难以解析
sysfs on /sys type sysfs (rw,nosuid,nodev,noexec,relatime,seclabel)
proc on /proc type proc (rw,nosuid,nodev,noexec,relatime)
devtmpfs on /dev type devtmpfs (rw,nosuid,seclabel,size=8131024k,nr_inodes=2032756,mode=755)
securityfs on /sys/kernel/security type securityfs (rw,nosuid,nodev,noexec,relatime)
[...]
/dev/nvme0n1p2 on /boot type ext4 (rw,relatime,seclabel)
/dev/nvme0n1p1 on /boot/efi type vfat (rw,relatime,fmask=0077,dmask=0077,codepage=437,iocharset=ascii,shortname=winnt,errors=remount-ro)
[...]
gvfsd-fuse on /run/user/100977/gvfs type fuse.gvfsd-fuse (rw,nosuid,nodev,relatime,user_id=100977,group_id=100977)
/dev/sda1 on /run/media/seth/pocket type ext4 (rw,nosuid,nodev,relatime,seclabel,uhelper=udisks2)
/dev/sdc1 on /run/media/seth/trip type ext4 (rw,nosuid,nodev,relatime,seclabel,uhelper=udisks2)
binfmt_misc on /proc/sys/fs/binfmt_misc type binfmt_misc (rw,relatime)
要解决这个问题,请尝试这样的别名
alias mnt="mount | awk -F' ' '{ printf \"%s\t%s\n\",\$1,\$3; }' | column -t | egrep ^/dev/ | sort"
此别名使用 awk 按列解析 mount 的输出,从而将输出减少到您可能正在寻找的内容(已挂载的硬盘驱动器,而不是文件系统)
$ mnt
/dev/mapper/fedora-root /
/dev/nvme0n1p1 /boot/efi
/dev/nvme0n1p2 /boot
/dev/sda1 /run/media/seth/pocket
/dev/sdc1 /run/media/seth/trip
在 MacOS 上,mount 命令不会提供非常详细的输出,因此别名可能是多余的。 但是,如果您更喜欢简洁的报告,请尝试此操作
alias mnt='mount | grep -E ^/dev | column -t'
结果
$ mnt
/dev/disk1s1 on / (apfs, local, journaled)
/dev/disk1s4 on /private/var/vm (apfs, local, noexec, journaled, noatime, nobrowse)
在您的 grep 历史记录中查找命令
有时您会弄清楚如何在终端中执行某些操作,并向自己保证永远不会忘记您刚刚学到的知识。 然后一个小时过去了,你完全忘记了你做了什么。
搜索您的 Bash 历史记录是每个人时不时都必须做的事情。 如果您确切知道您要搜索的内容,则可以使用 Ctrl+R 在您的历史记录中执行反向搜索,但有时您记不起要查找的确切命令。
这是一个使该任务更容易的别名
alias gh='history|grep'
这是一个如何使用它的示例
$ gh bash
482 cat ~/.bashrc | grep _alias
498 emacs ~/.bashrc
530 emacs ~/.bash_aliases
531 source ~/.bashrc
按修改时间排序
每个星期一都会发生这种情况:您开始工作,坐在电脑前,打开一个终端,然后您发现您忘记了上周五在做什么。 您需要一个别名来列出最近修改的文件。
您可以使用 ls 命令创建一个别名来帮助您找到您的进度
alias left='ls -t -1'
输出很简单,但如果您愿意,可以使用 --long 选项对其进行扩展。 该别名(如所列)显示如下
$ left
demo.jpeg
demo.xcf
design-proposal.md
rejects.txt
brainstorm.txt
query-letter.xml
计数文件
如果您需要知道目录中有多少个文件,则解决方案是 UNIX 命令构造的最经典示例之一:您使用 ls 命令列出文件,使用 -1 选项控制其输出仅为一列,然后将该输出通过管道传递到 wc(字数统计)命令以计算有多少行单个文件。
这是一个很好的演示,说明了 UNIX 哲学如何允许用户使用小型系统组件构建自己的解决方案。 如果您碰巧每天执行此操作多次,则此命令组合也需要大量键入,并且如果不使用 -R 选项,它不完全适用于目录的目录,这会向输出中引入新行并使练习变得毫无用处。
相反,此别名使该过程变得容易
alias count='find . -type f | wc -l'
这一个计算文件,忽略目录,但 *不* 忽略目录的内容。 如果您有一个包含两个目录的项目文件夹,每个目录包含两个文件,则别名返回四个,因为整个项目中有四个文件。
$ ls
foo bar
$ count
4
创建一个 Python 虚拟环境
您使用 Python 编码吗?
您经常使用 Python 编码吗?
如果您这样做,那么您知道创建 Python 虚拟环境至少需要 53 次击键。
这太多了 49 个,但可以使用两个名为 ve 和 va 的新别名轻松避免
alias ve='python3 -m venv ./venv'
alias va='source ./venv/bin/activate'
运行 ve 会创建一个名为 venv 的新目录,其中包含 Python3 的常用虚拟环境文件系统。 va 别名会在您当前的 shell 中激活环境
$ cd my-project
$ ve
$ va
(venv) $
添加复制进度条
每个人都取笑进度条,因为它们臭名昭著地不准确。 然而,在内心深处,我们似乎都想要它们。 UNIX cp 命令没有进度条,但它有一个 -v 选项用于详细模式,这意味着它会将每个正在复制的文件的名称回显到您的终端。 这是一个非常好的技巧,但当您复制一个大文件并想要指示有多少文件尚未传输时,它的效果不是很好。
pv 命令在复制期间提供进度条,但它并不常见,不是默认应用程序。 另一方面,rsync 命令包含在几乎每个可用的 POSIX 系统的默认安装中,并且它被广泛认为是远程和本地复制文件的最聪明的方法之一。
更好的是,它有一个内置的进度条。
alias cpv='rsync -ah --info=progress2'
使用此别名与使用 cp 命令相同
$ cpv bigfile.flac /run/media/seth/audio/
3.83M 6% 213.15MB/s 0:00:00 (xfr#4, to-chk=0/4)
使用此命令的一个有趣的副作用是,rsync 会复制文件和目录,而无需 cp 否则需要的 -r 标志。
保护自己免受文件删除事故的影响
您不应该使用 rm 命令。 rm 手册甚至这样说
警告:如果您使用“rm”删除文件,通常可以恢复该文件的内容。 如果您想更确保内容真正无法恢复,请考虑使用“shred”。
如果您想删除文件,您应该将该文件移动到您的回收站,就像您在使用桌面时所做的那样。
POSIX 使这很容易,因为回收站是您文件系统中一个可访问的实际位置。 该位置可能会更改,具体取决于您的平台:在 FreeDesktop 上,回收站位于 ~/.local/share/Trash,而在 MacOS 上它是 ~/.Trash,但无论哪种方式,它都只是一个目录,您将文件放入其中,您希望在您准备好永久删除它们之前将它们隐藏起来。
这个简单的别名提供了一种从终端将文件扔进回收站的方法
alias tcn='mv --force -t ~/.local/share/Trash '
此别名使用一个鲜为人知的 mv 标志,该标志使您可以将要移动的文件作为最终参数提供,而忽略了通常对该文件首先列出的要求。 现在您可以使用您的新命令将文件和文件夹移动到您的系统回收站
$ ls
foo bar
$ tcn foo
$ ls
bar
现在文件“消失”了,但只是在您突然意识到您仍然需要它之前。 在那时,您可以从您的系统回收站中抢救该文件;务必在退出时给 Bash 和 mv 开发人员小费。
注意:如果您需要更强大的 Trash 命令和更好的 FreeDesktop 兼容性,请参阅 Trashy。
简化您的 Git 工作流程
每个人都有独特的工作流程,但无论如何通常都有重复的任务。 如果您定期使用 Git,那么可能有一些序列您发现自己重复得非常频繁。 也许您发现自己回到主分支并一遍又一遍地提取最新的更改,或者您发现自己创建标签然后将它们推送到远程,或者也许完全是其他的东西。
无论您厌倦了输入哪些 Git 咒语,您都可以通过 Bash 别名减轻一些痛苦。 在很大程度上由于它能够将参数传递给钩子,因此 Git 具有丰富的自省命令集,这些命令使您不必在 Bash 中执行不可思议的壮举。
例如,你可能很难在 Bash 中找到一个项目的顶层目录(就 Bash 而言,这完全是一个随意的指定,因为计算机的绝对顶层是根目录),但 Git 可以通过一个简单的查询来了解其顶层。如果你深入研究 Git hooks,你会发现自己能够了解到 Bash 一无所知的各种信息,但你可以利用 Bash 别名来发挥这些信息的作用。
这是一个别名,用于查找 Git 项目的顶层,无论你当前在该项目的哪个位置工作,然后更改目录到它,切换到 master 分支,并执行 Git pull
alias startgit='cd `git rev-parse --show-toplevel` && git checkout master && git pull'
这种别名绝不是一个普遍有用的别名,但它演示了一个相对简单的别名如何消除大量繁琐的导航、命令和等待提示。
一个更简单,可能更通用的别名会将你返回到 Git 项目的顶层。这个别名很有用,因为当你正在处理一个项目时,该项目或多或少会成为你的“临时主目录”。应该像去你的实际主目录一样简单地去“家”,这是一个实现此功能的别名
alias cg='cd `git rev-parse --show-toplevel`'
现在,命令 cg 将你带到 Git 项目的顶部,无论你深入其目录结构多深。
同时更改目录并查看内容
曾经(据称)一位顶尖科学家提出,我们可以通过利用极客们输入 cd 后跟 ls 所消耗的能量来解决地球上的许多能源问题。
这是一种常见的模式,因为通常当你更改目录时,你会有一种冲动或需要查看周围有什么。
但是,“行走”你计算机的目录树不必是一个开始-停止的过程。
这一个有点作弊,因为它根本不是一个别名,但这是一个探索 Bash 函数的好借口。虽然别名非常适合快速替换,但 Bash 允许你在你的 .bashrc 文件中添加本地函数(或者一个单独的函数文件,你将其加载到 .bashrc 中,就像你处理你的别名文件一样)。
为了保持模块化,创建一个名为 ~/.bash_functions 的新文件,然后让你的 .bashrc 加载它
if [ -e $HOME/.bash_functions ]; then
source $HOME/.bash_functions
fi
在函数文件中,添加以下代码
function cl() {
DIR="$*";
# if no DIR given, go home
if [ $# -lt 1 ]; then
DIR=$HOME;
fi;
builtin cd "${DIR}" && \
# use your preferred ls command
ls -F --color=auto
}
将该函数加载到你的 Bash 会话中,然后尝试一下
$ source ~/.bash_functions
$ cl Documents
foo bar baz
$ pwd
/home/seth/Documents
$ cl ..
Desktop Documents Downloads
[...]
$ pwd
/home/seth
函数比别名灵活得多,但有了这种灵活性,你就需要负责确保你的代码有意义并且做你期望的事情。别名应该很简单,所以保持它们的简单但有用。对于 Bash 行为的重大修改,请使用函数或自定义 shell 脚本,并将其保存到 PATH 中的某个位置。
顺便说一句,实际上有一些巧妙的技巧可以实现作为别名的 cd 和 ls 序列,所以如果你足够耐心,那么即使使用普通的别名,天空才是极限。
开始使用别名和函数
自定义你的环境是 Linux 的乐趣所在,提高你的效率是 Linux 改变生活的关键。从简单的别名开始,毕业到函数,并在评论中发布你必备的别名!
28 条评论