对一次又一次地输入同一个长命令感到厌烦了吗?你感觉在命令行上工作没有效率吗?Bash别名可以让世界变得不同!![]() Bash别名是一个用新的名字来补充或者覆盖一个bash命令的方法。Bash别名使得用户能够很容易地在一个POSIX标准的终端中定制个人体验。它们通常被定义在$HOME/.bashrc或者$HOME/bash_aliases(该文件必须被$HOME/.bashrc加载)中。 大多数Linux发行版都在每个新用户的.bashrc中添加了一些流行的别名。下面就是一个很简单的展示bash别名句法的例子:alias ls='ls -F' alias ll='ls -lh'然而,不是所有的发行版都提前“搭载”了流行的别名。如果你手动添加别名,你需要将他们加载到你当前的bash回话中:$ source ~/.bashrc或者,你可以关闭你的终端,然后重新打开以便其能够加载最新的配置文件(译注:如~/.bashrc)。如果你在你的Bash启动脚本中定义了上面那些别名,你将能够在终端输入ll然后得到命令ls -l的结果。而当你输入ls的时候,你会得到ls -F*的结果而不是普通的ls。那些别名是非常棒的,但是它们只是挠到了可以实现的魔法的表面。下面是top 10别名,一旦你开始尝试它们,你将会无法摆脱对它们的依赖。 ![]() 开始之前,创建一个文件~/.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开启你的Linux计算机生涯,那么你也可以在终端中进行同样的工作,但是这并不是非常简练。 将这个别名添加到你的GNU系统的配置中去:alias lt='ls --human-readable --size -1 -S --classify'这个别名将lt替换为一个能显示每个对象尺寸,并按照改尺寸分类后以单列的形式展示,同时具有指明文件类型的注记的命令。加载你的新别名,然后试一下吧:$ 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,当然这也许不是你想要的。这都是你的选择。 ![]() 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命令不提供verbose输出。然而如果你更喜欢简介的报告,试一下这个: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' Here’s an example of how to use it:$ 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次按键。太多了!不过这可以通过两个别名ve和va来解决:alias ve='python3 -m venv ./venv' alias va='source ./venv/bin/activate' 运行ve会创建一个新的目录,叫做venu,其包含有通常的Python3的虚拟环境文件系统。va别名会在你当前shell上激活虚拟环境:$ cd my-project $ ve $ va (venv) $ ![]() 很多人都会取消进度条,因为它们经常并不靠谱。但是,从内心深处,我们每个人又都需要它们。UNIX的cp命令没有进度条,但是它有一个-v选项,用户多输出模式,意味着他会输出每个正在被拷贝的文件的名字到你的终端中。那是一个非常棒的切入点,但是它在你拷贝一个大文件并想要知道该文件还有多少内容等待传输时并不能很好地工作。 pv明星提供了一个拷贝时的进度条,但是它不常作为一个默认命令使用。另一方阿敏,rsync命令几乎在所有的POSXI系统中都是默认可获取的。并且其被广泛视作在本地或者远程拷贝文件的最聪明的方法之一。而且,它还有一个内置的进度条: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使得这变得容易,因为垃圾箱实际上是你的文件系统中一个可访问的实际的路径。那个路径也许可以改变,这取决于你的平台: 在许多平台上是~/.local/share/Trash,而在MacOS上是~/.Trash。但是它们本质上都是一个暂时放置文件的地方,并且可以过后被你完全清楚。下面的命令提供了也方法来从终端将文件丢入你的垃圾箱的方式:alias tcn='mv --force -t ~/.local/share/Trash ' 这个命令使用了一个鲜有人知的mv参数,能够让你将想要的文件作为最后一个参数给出,而不是想通常一样需要作为第一个被列出的文件。现在你可以使用这个新命令来移动文件或文件夹到系统垃圾箱中:$ ls foo bar $ tcn foo $ ls bar 现在文件消失了,但是你知道你仍然可以再次获取它。你可以从系统垃圾箱中恢复它们。注意:如果你需要一个更强劲的Trash命令,可以了解一下Trashy。 ![]() 每个人都有一个独一无二的工作流,但是通常都会带有一些重复性任务。如果你使用Git作为基础,你可能会发现你会重复一些操作多次。也许你会发现自己经常需要回到主分支然后拉取最近的更新,或者需要创建标签然后将它们推送到远端仓库等等。 不管是任何你已经厌烦于多次输入的Git命令,你也许都可以使用Bash别名来从痛苦中解脱。例如,当你挣扎于在项目顶级目录中进行定位时,Git通过一个简单的query来获取它的顶级目录。如果你研究Git hooks,你会发现自己也能够找到Bash不知道的一些信息,并且使用一个bash别名来简化工作。下面是一个别名来找到一个Git项目的顶级目录。不管是否你正工作于该项目,并且会同时将你当前的目录切换到那里,以及切换到主分支,执行git pull:alias startgit='cd `git rev-parse --show-toplevel` && git checkout master && git pull' 这种类型的别名不大可能是一个通用的别名,但是它展示了一个相对简单的别名通常可以消除许多繁杂的命令输入。一个更简单,但是可能更通用的别名是用于将你i返回到当前Git项目的顶级目录。这个别名在你工作于一个Git项目时会非常有用。alias cg='cd `git rev-parse --show-toplevel`' 现在cg能够将你带回到你的GIt项目的顶层,只要你目前位于该项目地下。 ![]() 一个有趣的事实是,很多然在cd到某个路径后,总会忍不住会马上使用ls命令,来查看该路径下的内容。仔细想一下,你是不是也是这样! 下面我们要展示的并不是一个别名。它展示了一个探索Bash函数的使用的好方法。我们将函数放在~/.bashrc文件中,或者放在单独的一个文件中,然后在~/.bashrc中加载它。为了保持模块性,我们创建一个新的文件~/.bash_functions并在.bashrc文件中加载它:if [ -e $HOME/.bash_functions ]; then source $HOME/.bash_functions fi 在~/.bash_functions文件中添加如下代码: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中的shel脚本来完成工作。 ![]() 定制自己的工作环境使得Linux非常有趣,并且提升自己的工作效率也是Linux的一个特点。从简单的别名开始,然后去构建自己的函数,然后把你任务必须要拥有的别名展示在评论区吧! 本文译自:Bash aliases you can’t live without译者:开源视界校对:OpenView原文链接:https://opensource.com/article/19/7/bash-aliases?utm_campaign=intrel原文遵循:CC BY-SA 4.0协议 ---------------------------------------------------------------------------------------------------------------------- 我们尊重原创,也注重分享,文章来源于微信公众号:EmuLab,建议关注公众号查看原文。如若侵权请联系qter@qter.org。 ---------------------------------------------------------------------------------------------------------------------- |