厌倦了一遍又一遍地输入相同的长命令?你以为在命令行上工做效率低吗?Bash 别名能够为你创造一个不同凡响的世界。node
Bash 别名是一种用新的命令补充或覆盖 Bash 命令的方法。Bash 别名使用户能够轻松地在 POSIX 终端中自定义其体验。它们一般定义在 $HOME/.bashrc
或 $HOME/bash_aliases
中(它是由 $HOME/.bashrc
加载的)。python
大多数发行版在新用户账户的默认 .bashrc
文件中至少添加了一些流行的别名。这些能够用来简单演示 Bash 别名的语法:linux
alias ls='ls -F'
alias ll='ls -lh'
复制代码
但并不是全部发行版都附带预先添加好的别名。若是你想手动添加别名,则必须将它们加载到当前的 Bash 会话中:git
$ source ~/.bashrc
复制代码
不然,你能够关闭终端并从新打开它,以便从新加载其配置文件。github
经过 Bash 初始化脚本中定义的那些别名,你能够键入 ll
而获得 ls -l
的结果,当你键入 ls
时,获得也不是原来的 ls 的普通输出。shell
那些别名很棒,但它们只是浅尝辄止。如下是十大 Bash 别名,一旦你试过它们,你会发现不再能离开它们。编程
在开始以前,建立一个名为 ~/.bash_aliases
的文件:json
$ touch ~/.bash_aliases
复制代码
而后,确认这些代码出如今你的 ~/.bashrc
文件当中:bash
if [ -e $HOME/.bash_aliases ]; then
source $HOME/.bash_aliases
fi
复制代码
若是你想亲自尝试本文中的任何别名,请将它们输入到 .bash_aliases
文件当中,而后使用 source ~/.bashrc
命令将它们加载到当前 Bash 会话中。网络
若是你一开始使用过 GNOME 中的 Nautilus、MacOS 中的 Finder 或 Windows 中的资源管理器等 GUI 文件管理器,那么你极可能习惯了按文件大小排序文件列表。你也能够在终端上作到这一点,但这条命令不是很简洁。
将此别名添加到 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
命令过去很简单。只需一个命令,你就能够得到计算机上全部已挂载的文件系统的列表,它常常用于概览链接到工做站有哪些驱动器。在过去看到超过3、四个条目就会使人印象深入,由于大多数计算机没有那么多的 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)
复制代码
有时你好不容易弄清楚了如何在终端完成某件事,并以为本身永远不会忘记你刚学到的东西。而后,一个小时过去以后你就彻底忘记了你作了什么。
搜索 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'
复制代码
这个别名会计算文件,忽略目录,但不会忽略目录的内容。若是你有一个包含两个目录的项目文件夹,每一个目录包含两个文件,则该别名将返回 4,由于整个项目中有 4 个文件。
$ ls
foo bar
$ count
4
复制代码
你用 Python 编程吗?
你用 Python 编写了不少程序吗?
若是是这样,那么你就知道建立 Python 虚拟环境至少须要 53 次击键。
这个数字里有 49 次是多余的,它很容易被两个名为 ve
和 va
的新别名所解决:
alias ve='python3 -m venv ./venv'
alias va='source ./venv/bin/activate'
复制代码
运行 ve
会建立一个名为 venv
的新目录,其中包含 Python 3 的经常使用虚拟环境文件系统。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
无需 -r
标志就能够复制文件和目录,而 cp
则须要。
你不该该使用 rm
命令。rm
手册甚至这样说:
**警告:**若是使用
rm
删除文件,一般能够恢复该文件的内容。若是你想要更加确保内容真正没法恢复,请考虑使用shred
。
若是要删除文件,则应将文件移动到“废纸篓”,就像使用桌面时同样。
POSIX 使这很简单,由于垃圾桶是文件系统中可访问的一个实际位置。该位置可能会发生变化,具体取决于你的平台:在 FreeDesktop 上,“垃圾桶”位于 ~/.local/share/Trash
,而在 MacOS 上则是 ~/.Trash
,但不管如何,它只是一个目录,你能够将文件藏在那个看不见的地方,直到你准备永久删除它们为止。
这个简单的别名提供了一种从终端将文件扔进垃圾桶的方法:
alias tcn='mv --force -t ~/.local/share/Trash '
复制代码
该别名使用一个不为人知的 mv
标志(-t
),使你可以提供做为最终移动目标的参数,而忽略了首先列出要移动的文件的一般要求。如今,你可使用新命令将文件和文件夹移动到系统垃圾桶:
$ ls
foo bar
$ tcn foo
$ ls
bar
复制代码
如今文件已“消失”,只有在你一头冷汗的时候才意识到你还须要它。此时,你能够从系统垃圾桶中抢救该文件;这确定能够给 Bash 和 mv
开发人员提供一些帮助。
**注意:**若是你须要一个具备更好的 FreeDesktop 兼容性的更强大的垃圾桶命令,请参阅 Trashy。
每一个人都有本身独特的工做流程,但不管如何,一般都会有重复的任务。若是你常用 Git,那么你可能会发现本身常常重复的一些操做序列。也许你会发现本身回到主分支并成天一遍又一遍地拉取最新的变化,或者你可能发现本身建立了标签而后将它们推到远端,抑或可能彻底是其它的什么东西。
不管让你厌倦一遍遍输入的 Git 魔咒是什么,你均可以经过 Bash 别名减轻一些痛苦。很大程度上,因为它可以将参数传递给钩子,Git 拥有着丰富的内省命令,可让你没必要在 Bash 中执行那些丑陋冗长的命令。
例如,虽然你可能很难在 Bash 中找到项目的顶级目录(就 Bash 而言,它是一个彻底随意的名称,由于计算机的绝对顶级是根目录),但 Git 能够经过简单的查询找到项目的顶级目录。若是你研究过 Git 钩子,你会发现本身可以找到 Bash 一无所知的各类信息,而你能够利用 Bash 别名来利用这些信息。
这是一个来查找 Git 项目的顶级目录的别名,不管你当前在哪一个项目中工做,均可以将目录改变为顶级目录,切换到主分支,并执行 Git 拉取:
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 的行为,请使用保存到 PATH
环境变量中某个位置的函数或自定义的 shell 脚本。
附注,有一些巧妙的奇技淫巧来实现 cd
和 ls
序列做为别名,因此若是你足够耐心,那么即便是一个简单的别名也永无止限。
能够定制你的环境使得 Linux 变得如此有趣,提升效率使得 Linux 能够改变生活。开始使用简单的别名,进而使用函数,并在评论中发布你必须拥有的别名!
via: opensource.com/article/19/…
做者:Seth Kenlon 选题:lujun9972 译者:wxy 校对:wxy