当前位置: 首页 > 科技观察

不可或缺的Bash别名

时间:2023-03-13 15:07:54 科技观察

厌倦了一遍又一遍地输入相同的长命令?您是否觉得在命令行上工作效率低下?Bash别名可以为您带来不同的世界。Bash别名是一种用新命令补充或覆盖Bash命令的方法。Bash别名使用户可以轻松定制他们在POSIX终端中的体验。它们通常在$HOME/.bashrc或$HOME/bash_aliases中定义(由$HOME/.bashrc加载)。大多数发行版至少会为新用户帐户在默认的.bashrc文件中添加一些流行的别名。这些可以用来简单地演示Bash别名的语法:aliasls='ls-F'aliasll='ls-lh'但并非所有发行版都带有预先存在的别名。如果您想手动添加别名,则必须将它们加载到当前Bash会话中:$source~/.bashrc否则,您可以关闭终端并重新打开它,以便重新加载其配置文件。通过Bashinit脚本中定义的那些别名,您可以键入ll并获得ls-l的结果,并且当您键入ls时,也可以获得ls的正常输出。这些别名很棒,但它们只是表面现象。以下是排名前10位的Bash别名,一旦您尝试使用它们,您将再也离不开它们。第一次设置在开始之前,创建一个名为~/.bash_aliases的文件:$touch~/.bash_aliases然后,确保这些代码出现在你的~/.bashrc文件中:if[-e$HOME/.bash_aliases];然后source$HOME/.bash_aliases如果您想自己尝试本文中的任何别名,请将它们输入.bash_aliases文件,然后使用source~/.bashrc命令将它们加载到您当前的Bash会话中。按文件大小排序如果您开始使用GUI文件管理器,例如GNOME中的Nautilus、MacOS中的Finder或Windows中的资源管理器,您可能习惯于按文件大小对文件列表进行排序。您也可以在终端中执行此操作,但此命令不是很简洁。在GNU系统上将此别名添加到您的配置中:aliaslt='ls--human-readable--size-1-S--classify'此别名将lt替换为ls命令,该命令显示每个项目,按大小排序,并使用符号来表示文件类型。加载新别名并尝试:$source~/.bashrc$lttotal344K140Kconfigure*44Kaclocal.m436KLICENSE32Kconfig.status*24KMakefile24KMakefile.in12Kconfig.log8.0KREADME.md4.0Kinfo.slackermedia.Git-门户.json4.0Kgit-portal.spec4.0Kflatpak.path.patch4.0KMakefile.am*4.0Kdot-gitlab.ci.yml4.0Kconfigure.ac*0autom4te.cache/0share/0bin/0install-sh@0compile@0missing@0COPYING@在MacOS或BSD上,ls命令没有相同的选项,所以这个别名可以更改为:aliaslt='du-sh*|sort-h'这个版本的结果略有不同:$du-sh*|sort-h0compile0COPYING0install-sh0missing4.0Kconfigure.ac4.0Kdot-gitlab.ci.yml4.0Kflatpak.path.patch4.0Kgit-portal.spec4.0K信息。slackermedia.Git-portal.json4.0KMakefile.am8.0KREADME.md12Kconfig.log16Kbin24KMakefile24KMakefile.in32Kconfig.status36KLICENSE44Kaclocal.m460Kshare140Kconfigure476Kautom4te.cache实际上,即使在Linux上,上述命令也非常有用,因为用ls列出的目录和符号链接的大小为0,这可能不是您真正想要的信息。使用哪一个取决于您自己的喜好。感谢BradAlexander提出这个别名的想法。仅查看已安装的驱动器mount命令过去很简单。只需一个命令,您就可以获得计算机上所有已安装文件系统的列表,这通常用于了解哪些驱动器已连接到您的工作站。过去看到超过三四个条目会让人印象深刻,而且由于大多数计算机没有那么多USB端口,因此更容易看到结果。现在的电脑有点复杂,有LVM,有物理驱动器,有网络存储,有虚拟文件系统,mount的结果很难一目了然:sysfson/systypesysfs(rw,nosuid,nodev,noexec,relatime,seclabel)procon/proctypeproc(rw,nosuid,nodev,noexec,relatime)devtmpfson/devtypedevtmpfs(rw,nosuid,seclabel,size=8131024k,nr_inodes=2032756,mode=755)securityfson/sys/kernel/securitytypesecurityfs(rw,nosuid,nodev,noexec,relatime)[...]/dev/nvme0n1p2on/boottypeext4(rw,relatime,seclabel)/dev/nvme0n1p1on/boot/efitypevfat(rw,relatime,fmask=0077,dmask=0077,codepage=437,iocharset=ascii,shortname=winnt,errors=remount-ro)[...]gvfsd-fuseon/run/user/100977/gvfstypefuse.gvfsd-fuse(rw,nosuid,nodev,relatime,user_id=100977,group_id=100977)/dev/sda1on/run/media/seth/pockettypeext4(rw,nosuid,nodev,relatime,seclabel,uhelper=udisks2)/dev/sdc1on/run/media/seth/triptypeext4(rw,nosuid,nodev,relatime,seclabel,uhelper=udisks2)binfmt_miscon/proc/sys/fs/binfmt_misctypebinfmt_misc(rw,relatime)要解决此问题,请尝试此别名:aliasmnt='mount|awk-F'''{printf"%s\t%s\n",$1,$3;}'|列-t|egrep^/开发/|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命令不提供非常详细的输出,所以这个别名可能过于简单,但如果你喜欢一个简洁的报告,试试这个:aliasmnt='mount|grep-E^/开发|column-t'结果:$mnt/dev/disk1s1on/(apfs,local,journaled)/dev/disk1s4on/private/var/vm(apfs,local,noexec,journaled,noatime,nobrowse)在你的文件中查找命令grephistory有时你终于弄清楚如何在终端上做某事,并且感觉你永远不会忘记你刚刚学到的东西。然后,一个小时过去后,你完全忘记了自己做了什么。搜索Bash历史是每个人时常做的事情。如果您确切知道要搜索的内容,可以使用Ctrl+R反向搜索历史记录,但有时您不记得要查找的确切命令。这是一个使任务更容易的别名:aliasgh='history|grep'下面是一个如何使用的例子:$ghbash482cat~/.bashrc|grep_alias498emacs~/.bashrc530emacs~/.bash_aliases531源~/.按修改时间排序的bashrc每个星期一都是这样的:你坐在电脑前开始工作,你打开一个终端,然后你意识到你忘记了上周五你在做什么。您需要的是列出最近修改的文件的别名。您可以使用ls命令创建别名以帮助您找到您离开的地方:aliasleft='ls-t-1'输出很简单,但是您可以根据需要使用--long选项扩展它。这个别名如下:$leftdemo.jpegdemo.xcfdesign-proposal.mdrejects.txtbrainstorm.txtquery-letter.xmlfilecount如果你需要知道一个目录中有多少文件,这个解决方案是最典型的UNIX命令示例构造一:使用ls命令列出文件,使用-1选项将其输出控制为只有一列,然后将输出通过管道传递给wc(字数统计)命令以计算有多少行。这是UNIX哲学如何允许用户使用小型系统组件构建自己的解决方案的极好演示。如果您碰巧一天执行几次,则此命令组合也需要输入很多内容,并且它不适用于没有-R选项的目录,这会在输出中引入换行符并导致无用的结果。这个别名使这个过程变得简单:aliascount='find。-类型f|wc-l'这个别名计算文件,忽略目录,但不计算它们的内容。如果您有一个包含两个目录的项目文件夹,每个目录包含两个文件,则别名将返回4,因为整个项目中有4个文件。$lsfoobar$count4创建一个Python虚拟环境你用Python编程吗?你用Python写了很多程序吗?如果是这样,那么您就知道创建Python虚拟环境至少需要53次击键。这个数字中的49次是多余的,可以通过两个名为ve和va的新别名轻松解决:aliasve='python3-mvenv./venv'aliasva='source./venv/bin/activate'Runningvecreatesa名为venv的新目录包含Python3的常用虚拟环境文件系统。va别名在当前shell中激活环境:$cdmy-project$ve$va(venv)$添加一个复制进度条每个人都抱怨进度条,因为他们总是显得格格不入。然而在内心深处,我们似乎都想要它们。UNIXcp命令没有进度条,但它有一个用于详细信息的-v选项,它会回显复制到终端的每个文件名。这是一个非常巧妙的技巧,但当您复制一个大文件并想知道其中有多少尚未传输时,它就没那么有用了。pv命令可以在复制过程中提供进度条,但不常用。另一方面,rsync命令包含在几乎所有POSIX系统的默认安装中,它通常被认为是远程和本地复制文件的最聪明的方法之一。更好的是,它有一个内置的进度条。aliascpv='rsync-ah--info=progress2'使用此别名就像使用cp命令一样:$cpvbigfile.flac/run/media/seth/audio/3.83M6%213.15MB/s0:00:00(xfr#4,to-chk=0/4)使用这个命令的一个有趣的副作用是rsync可以在没有-r标志的情况下复制文件和目录,而cp可以。为避免意外删除,您不应使用rm命令。rm手册甚至这样说:警告:如果您使用rm删除文件,通常可以恢复该文件的内容。如果您想更加确定内容确实无法恢复,请考虑使用切碎。如果您删除了一个文件,您应该将该文件移至废纸篓,就像您在使用桌面时所做的那样。POSIX使这很容易,因为垃圾桶是文件系统中可访问的实际位置。该位置可能会根据您的平台而变化:在FreeDesktop上,垃圾桶位于~/.local/share/Trash,而在MacOS上它是~/.Trash,但无论如何,它只是一个目录,您可以将文件隐藏在其中直到您准备好永久删除它们。这个简单的别名提供了一种从终端删除文件的方法:aliastcn='mv--force-t~/.local/share/Trash'这个别名使用一个鲜为人知的mv标志(-t),使您能够提供一个参数是移动的最终目标,忽略了首先列出要移动的文件的通常要求。您现在可以使用一个新命令将文件和文件夹移动到系统垃圾箱:$lsfoobar$tcnfoo$lsbar现在文件“消失了”,当您惊出一身冷汗时才意识到您仍然需要它。此时,您可以从系统垃圾箱中抢救该文件;这肯定会给Bash和mv开发人员一些帮助。注意:如果您需要更强大的trash命令和更好的FreeDesktop兼容性,请参阅Trashy。简化你的Git工作流程每个人都有自己独特的工作流程,但无论如何,经常会有重复的工作。如果您经常使用Git,您可能会发现自己经常重复某些操作序列。也许你会发现自己整天都在回到master分支并一遍又一遍地拉取最新的更改,或者你会发现自己创建标签然后将它们推送到远程,或者可能完全是其他事情。无论Git的咒语是什么让您厌倦了一遍又一遍地输入,您都可以使用Bash别名来减轻一些痛苦。在很大程度上,由于它能够将参数传递给钩子,Git拥有丰富的内省命令,使您不必在Bash中执行那些丑陋、冗长的命令。例如,虽然您可能无法在Bash中找到项目的顶级目录(就Bash而言,它是一个完全任意的名称,因为计算机的绝对顶级是根目录),Git可以找到项目的带有简单查询目录的顶级目录。如果您研究过Git钩子,您会发现自己能够找到Bash不知道的各种信息,并且您可以使用Bash别名来利用这些信息。这是一个用于查找Git项目顶级目录的别名。无论你当前在哪个项目,都可以切换到顶层目录,切换到master分支,进行Git拉取:aliasstartgit='cd`gitrev-parse--show-toplevel`&&gitcheckoutmaster&&gitpull'这个别名绝不是一个普遍有用的别名,但它演示了一个相对简单的别名如何消除大量繁琐的导航、命令和等待提示。一个更简单且可能更通用的别名将使您返回到Git项目的顶级目录。这个别名非常有用,因为当您处理一个项目时,该项目或多或少会成为您的“临时主目录”。它应该像回家一样简单,就像回到你真正的家一样,这里有一个别名:aliascg='cd`gitrev-parse--show-toplevel`'现在,命令cg带你到Git项目的top,无论您深入了解目录结构。同时切换目录和查看目录内容(据说)一位著名科学家曾经提出,我们可以通过收集极客输入cd再输入ls所消耗的能量来解决地球上的许多能源问题。这是一种常见的用法,因为通常当您更改目录时,您会有冲动或需要四处查看。但是在计算机的目录树中移动并不一定是走走停停的过程。这是一个欺骗,因为它根本不是别名,但它是探索Bash功能的一个很好的借口。虽然别名非常适合快速替换命令,但Bash还允许您在.bashrc文件中添加本机函数(或像别名文件一样加载到.bashrc中的单独函数文件)。为了保持模块化,创建一个名为~/.bash_functions的新文件,然后让你的.bashrc加载它:if[-e$HOME/.bash_functions];然后在该函数文件中获取$HOME/.bash_functions,添加这些代码:functioncl(){DIR="$*";#如果没有给出DIR,则返回homeif[$#-lt1];然后DIR=$HOME;菲;builtincd"${DIR}"&&\#使用你喜欢的ls命令ls-F--color=auto}将函数加载到你的Bash会话中,然后尝试:$source~/.bash_functions$clDocumentsfoobarbaz$pwd/home/seth/Documents$cl..DesktopDocumentsDownloads[...]$pwd/home/seth函数比别名更灵活,但有了这种灵活性,您有责任确保代码有意义并按您的期望行事.别名很简单,所以要保持简单和有用。要正式修改Bash的行为,请使用保存到PATH环境变量中某个位置的函数或自定义shell脚本。附带说明一下,有一些巧妙的技巧可以将cd和ls序列作为别名,因此如果您足够耐心,即使是简单的别名也永远不会结束。开始别名化和功能化。定制您的环境让Linux如此有趣,而提高生产力让Linux改变生活。开始使用简单的别名,继续使用函数,并在评论中发布您必须拥有的别名!