厭倦了一遍又一遍地輸入相同的長命令?你覺得在命令行上工作效率低嗎?Bash 別名可以為你創(chuàng)造一個(gè)與眾不同的世界。
-- Seth Kenlon(作者)
Bash 別名是一種用新的命令補(bǔ)充或覆蓋 Bash 命令的方法。Bash 別名使用戶可以輕松地在 POSIX 終端中自定義其體驗(yàn)。它們通常定義在 $HOME/.bashrc 或 $HOME/bash_aliases 中(它是由 $HOME/.bashrc 加載的)。
大多數(shù)發(fā)行版在新用戶帳戶的默認(rèn) .bashrc 文件中至少添加了一些流行的別名。這些可以用來簡單演示 Bash 別名的語法:
alias ls='ls -F' alias ll='ls -lh'
但并非所有發(fā)行版都附帶預(yù)先添加好的別名。如果你想手動(dòng)添加別名,則必須將它們加載到當(dāng)前的 Bash 會(huì)話中:
$ source ~/.bashrc
否則,你可以關(guān)閉終端并重新打開它,以便重新加載其配置文件。
通過 Bash 初始化腳本中定義的那些別名,你可以鍵入 ll 而得到 ls -l 的結(jié)果,當(dāng)你鍵入 ls 時(shí),得到也不是原來的 ls 的普通輸出。
那些別名很棒,但它們只是淺嘗輒止。以下是十大 Bash 別名,一旦你試過它們,你會(huì)發(fā)現(xiàn)再也不能離開它們。
首先設(shè)置
在開始之前,創(chuàng)建一個(gè)名為 ~/.bash_aliases 的文件:
$ touch ~/.bash_aliases
然后,確認(rèn)這些代碼出現(xiàn)在你的 ~/.bashrc 文件當(dāng)中:
if [ -e $HOME/.bash_aliases ]; then source $HOME/.bash_aliases fi
如果你想親自嘗試本文中的任何別名,請(qǐng)將它們輸入到 .bash_aliases 文件當(dāng)中,然后使用 source ~/.bashrc 命令將它們加載到當(dāng)前 Bash 會(huì)話中。
按文件大小排序
如果你一開始使用過 GNOME 中的 Nautilus、macOS 中的 Finder 或 windows 中的資源管理器等 GUI 文件管理器,那么你很可能習(xí)慣了按文件大小排序文件列表。你也可以在終端上做到這一點(diǎn),但這條命令不是很簡潔。
將此別名添加到 GNU 系統(tǒng)上的配置中:
alias lt='ls --human-readable --size -1 -S --classify'
此別名將 lt 替換為 ls 命令,該命令在單個(gè)列中顯示每個(gè)項(xiàng)目的大小,然后按大小對(duì)其進(jìn)行排序,并使用符號(hào)表示文件類型。加載新別名,然后試一下:
$ 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 命令沒有相同的選項(xiàng),因此這個(gè)別名可以改為:
alias lt='du -sh * | sort -h'
這個(gè)版本的結(jié)果稍有不同:
$ 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
實(shí)際上,即使在 linux上,上面這個(gè)命令也很有用,因?yàn)槭褂?ls 列出的目錄和符號(hào)鏈接的大小為 0,這可能不是你真正想要的信息。使用哪個(gè)看你自己的喜好。
感謝 Brad Alexander 提供的這個(gè)別名的思路。
只查看掛載的驅(qū)動(dòng)器
mount 命令過去很簡單。只需一個(gè)命令,你就可以獲得計(jì)算機(jī)上所有已掛載的文件系統(tǒng)的列表,它經(jīng)常用于概覽連接到工作站有哪些驅(qū)動(dòng)器。在過去看到超過三、四個(gè)條目就會(huì)令人印象深刻,因?yàn)榇蠖鄶?shù)計(jì)算機(jī)沒有那么多的 USB 端口,因此這個(gè)結(jié)果還是比較好查看的。
現(xiàn)在計(jì)算機(jī)有點(diǎn)復(fù)雜,有 LVM、物理驅(qū)動(dòng)器、網(wǎng)絡(luò)存儲(chǔ)和虛擬文件系統(tǒng),mount 的結(jié)果就很難一目了然:
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)
要解決這個(gè)問題,試試這個(gè)別名:
alias mnt='mount | awk -F' ' '{ printf "%st%sn",$1,$3; }' | column -t | egrep ^/dev/ | sort'
此別名使用 awk 按列解析 mount 的輸出,將輸出減少到你可能想要查找的內(nèi)容(掛載了哪些硬盤驅(qū)動(dòng)器,而不是文件系統(tǒng)):
$ 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 命令不提供非常詳細(xì)的輸出,因此這個(gè)別名可能過度精簡了。但是,如果你更喜歡簡潔的報(bào)告,請(qǐng)嘗試以下方法:
alias mnt='mount | grep -E ^/dev | column -t'
結(jié)果:
$ mnt /dev/disk1s1 on / (apfs, local, journaled) /dev/disk1s4 on /private/var/vm (apfs, local, noexec, journaled, noatime, nobrowse)
在你的 grep 歷史中查找命令
有時(shí)你好不容易弄清楚了如何在終端完成某件事,并覺得自己永遠(yuǎn)不會(huì)忘記你剛學(xué)到的東西。然后,一個(gè)小時(shí)過去之后你就完全忘記了你做了什么。
搜索 Bash 歷史記錄是每個(gè)人不時(shí)要做的事情。如果你確切地知道要搜索的內(nèi)容,可以使用 Ctrl + R 對(duì)歷史記錄進(jìn)行反向搜索,但有時(shí)你無法記住要查找的確切命令。
這是使該任務(wù)更容易的別名:
alias gh='history|grep'
這是如何使用的例子:
$ gh bash 482 cat ~/.bashrc | grep _alias 498 emacs ~/.bashrc 530 emacs ~/.bash_aliases 531 source ~/.bashrc
按修改時(shí)間排序
每個(gè)星期一都會(huì)這樣:你坐在你的電腦前開始工作,你打開一個(gè)終端,你發(fā)現(xiàn)你已經(jīng)忘記了上周五你在做什么。你需要的是列出最近修改的文件的別名。
你可以使用 ls 命令創(chuàng)建別名,以幫助你找到上次離開的位置:
alias left='ls -t -1'
輸出很簡單,但如果你愿意,可以使用 --long 選項(xiàng)擴(kuò)展它。這個(gè)別名列出的顯示如下:
$ left demo.jpeg demo.xcf design-proposal.md rejects.txt brainstorm.txt query-letter.xml
文件計(jì)數(shù)
如果你需要知道目錄中有多少文件,那么該解決方案是 UNIX 命令構(gòu)造的最典型示例之一:使用 ls 命令列出文件,用-1 選項(xiàng)將其輸出控制為只有一列,然后輸出到 wc(單詞計(jì)數(shù))命令的管道,以計(jì)算有多少行。
這是 UNIX 理念如何允許用戶使用小型的系統(tǒng)組件構(gòu)建自己的解決方案的精彩演示。如果你碰巧每天都要做幾次,這個(gè)命令組合也要輸入很多字母,如果沒有使用 -R 選項(xiàng),它就不能用于目錄,這會(huì)為輸出引入新行并導(dǎo)致無用的結(jié)果。
而這個(gè)別名使這個(gè)過程變得簡單:
alias count='find . -type f | wc -l'
這個(gè)別名會(huì)計(jì)算文件,忽略目錄,但不會(huì)忽略目錄的內(nèi)容。如果你有一個(gè)包含兩個(gè)目錄的項(xiàng)目文件夾,每個(gè)目錄包含兩個(gè)文件,則該別名將返回 4,因?yàn)檎麄€(gè)項(xiàng)目中有 4 個(gè)文件。
$ ls foo bar $ count 4
創(chuàng)建 Python 虛擬環(huán)境
你用 Python 編程嗎?
你用 Python 編寫了很多程序嗎?
如果是這樣,那么你就知道創(chuàng)建 Python 虛擬環(huán)境至少需要 53 次擊鍵。
這個(gè)數(shù)字里有 49 次是多余的,它很容易被兩個(gè)名為 ve 和 va 的新別名所解決:
alias ve='python3 -m venv ./venv' alias va='source ./venv/bin/activate'
運(yùn)行 ve 會(huì)創(chuàng)建一個(gè)名為 venv 的新目錄,其中包含 Python 3 的常用虛擬環(huán)境文件系統(tǒng)。va 別名在當(dāng)前 shell 中的激活該環(huán)境:
$ cd my-project $ ve $ va (venv) $
增加一個(gè)復(fù)制進(jìn)度條
每個(gè)人都會(huì)吐槽進(jìn)度條,因?yàn)樗鼈兯坪蹩偸遣缓蠒r(shí)宜。然而,在內(nèi)心深處,我們似乎都想要它們。UNIX 的 cp 命令沒有進(jìn)度條,但它有一個(gè) -v 選項(xiàng)用于顯示詳細(xì)信息,它回顯了復(fù)制的每個(gè)文件名到終端。這是一個(gè)相當(dāng)不錯(cuò)的技巧,但是當(dāng)你復(fù)制一個(gè)大文件并且想要了解還有多少文件尚未傳輸時(shí),它的作用就沒那么大了。
pv 命令可以在復(fù)制期間提供進(jìn)度條,但它并不常用。另一方面,rsync 命令包含在幾乎所有的 POSIX 系統(tǒng)的默認(rèn)安裝中,并且它被普遍認(rèn)為是遠(yuǎn)程和本地復(fù)制文件的最智能方法之一。
更好的是,它有一個(gè)內(nèi)置的進(jìn)度條。
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)
使用此命令的一個(gè)有趣的副作用是 rsync 無需 -r 標(biāo)志就可以復(fù)制文件和目錄,而 cp 則需要。
避免意外刪除
你不應(yīng)該使用 rm 命令。rm 手冊(cè)甚至這樣說:
警告:如果使用 rm 刪除文件,通常可以恢復(fù)該文件的內(nèi)容。如果你想要更加確保內(nèi)容真正無法恢復(fù),請(qǐng)考慮使用 shred。
如果要?jiǎng)h除文件,則應(yīng)將文件移動(dòng)到“廢紙簍”,就像使用桌面時(shí)一樣。
POSIX 使這很簡單,因?yàn)槔笆俏募到y(tǒng)中可訪問的一個(gè)實(shí)際位置。該位置可能會(huì)發(fā)生變化,具體取決于你的平臺(tái):在 FreeDesktop 上,“垃圾桶”位于 ~/.local/share/Trash,而在 MacOS 上則是 ~/.Trash,但無論如何,它只是一個(gè)目錄,你可以將文件藏在那個(gè)看不見的地方,直到你準(zhǔn)備永久刪除它們?yōu)橹埂?/p>
這個(gè)簡單的別名提供了一種從終端將文件扔進(jìn)垃圾桶的方法:
alias tcn='mv --force -t ~/.local/share/Trash '
該別名使用一個(gè)鮮為人知的 mv 標(biāo)志(-t),使你能夠提供作為最終移動(dòng)目標(biāo)的參數(shù),而忽略了首先列出要移動(dòng)的文件的通常要求。現(xiàn)在,你可以使用新命令將文件和文件夾移動(dòng)到系統(tǒng)垃圾桶:
$ ls foo bar $ tcn foo $ ls bar
現(xiàn)在文件已“消失”,只有在你一頭冷汗的時(shí)候才意識(shí)到你還需要它。此時(shí),你可以從系統(tǒng)垃圾桶中搶救該文件;這肯定可以給 Bash 和 mv 開發(fā)人員提供一些幫助。
注意:如果你需要一個(gè)具有更好的 FreeDesktop 兼容性的更強(qiáng)大的垃圾桶命令,請(qǐng)參閱 Trashy 。
簡化 Git 工作流
每個(gè)人都有自己獨(dú)特的工作流程,但無論如何,通常都會(huì)有重復(fù)的任務(wù)。如果你經(jīng)常使用 Git,那么你可能會(huì)發(fā)現(xiàn)自己經(jīng)常重復(fù)的一些操作序列。也許你會(huì)發(fā)現(xiàn)自己回到主分支并整天一遍又一遍地拉取最新的變化,或者你可能發(fā)現(xiàn)自己創(chuàng)建了標(biāo)簽然后將它們推到遠(yuǎn)端,抑或可能完全是其它的什么東西。
無論讓你厭倦一遍遍輸入的 Git 魔咒是什么,你都可以通過 Bash 別名減輕一些痛苦。很大程度上,由于它能夠?qū)?shù)傳遞給鉤子,Git 擁有著豐富的內(nèi)省命令,可以讓你不必在 Bash 中執(zhí)行那些丑陋冗長的命令。
例如,雖然你可能很難在 Bash 中找到項(xiàng)目的頂級(jí)目錄(就 Bash 而言,它是一個(gè)完全隨意的名稱,因?yàn)橛?jì)算機(jī)的絕對(duì)頂級(jí)是根目錄),但 Git 可以通過簡單的查詢找到項(xiàng)目的頂級(jí)目錄。如果你研究過 Git 鉤子,你會(huì)發(fā)現(xiàn)自己能夠找到 Bash 一無所知的各種信息,而你可以利用 Bash 別名來利用這些信息。
這是一個(gè)來查找 Git 項(xiàng)目的頂級(jí)目錄的別名,無論你當(dāng)前在哪個(gè)項(xiàng)目中工作,都可以將目錄改變?yōu)轫敿?jí)目錄,切換到主分支,并執(zhí)行 Git 拉取:
alias startgit='cd `git rev-parse --show-toplevel` && git checkout master && git pull'
這種別名絕不是一個(gè)普遍有用的別名,但它演示了一個(gè)相對(duì)簡單的別名如何能夠消除大量繁瑣的導(dǎo)航、命令和等待提示。
一個(gè)更簡單,可能更通用的別名將使你返回到 Git 項(xiàng)目的頂級(jí)目錄。這個(gè)別名非常有用,因?yàn)楫?dāng)你在一個(gè)項(xiàng)目上工作時(shí),該項(xiàng)目或多或少會(huì)成為你的“臨時(shí)家目錄”。它應(yīng)該像回家一樣簡單,就像回你真正的家一樣,這里有一個(gè)別名:
alias cg='cd `git rev-parse --show-toplevel`'
現(xiàn)在,命令 cg 將你帶到 Git 項(xiàng)目的頂部,無論你下潛的目錄結(jié)構(gòu)有多深。
切換目錄并同時(shí)查看目錄內(nèi)容
(據(jù)稱)曾經(jīng)一位著名科學(xué)家提出過,我們可以通過收集極客輸入 cd 后跟 ls 消耗的能量來解決地球上的許多能量問題。
這是一種常見的用法,因?yàn)橥ǔ.?dāng)你更改目錄時(shí),你都會(huì)有查看周圍的內(nèi)容的沖動(dòng)或需要。
但是在你的計(jì)算機(jī)的目錄樹中移動(dòng)并不一定是一個(gè)走走停停的過程。
這是一個(gè)作弊,因?yàn)樗静皇莿e名,但它是探索 Bash 功能的一個(gè)很好的借口。雖然別名非常適合快速替換一個(gè)命令,但 Bash 也允許你在 .bashrc 文件中添加本地函數(shù)(或者你加載到 .bashrc 中的單獨(dú)函數(shù)文件,就像你的別名文件一樣)。
為了保持模塊化,創(chuàng)建一個(gè)名為 ~/.bash_functions 的新文件,然后讓你的 .bashrc 加載它:
if [ -e $HOME/.bash_functions ]; then source $HOME/.bash_functions fi
在該函數(shù)文件中,添加這些代碼:
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 }
將函數(shù)加載到 Bash 會(huì)話中,然后嘗試:
$ source ~/.bash_functions $ cl Documents foo bar baz $ pwd /home/seth/Documents $ cl .. Desktop Documents Downloads [...] $ pwd /home/seth
函數(shù)比別名更靈活,但有了這種靈活性,你就有責(zé)任確保代碼有意義并達(dá)到你的期望。別名是簡單的,所以要保持簡單而有用。要正式修改 Bash 的行為,請(qǐng)使用保存到 PATH 環(huán)境變量中某個(gè)位置的函數(shù)或自定義的 shell 腳本。
附注,有一些巧妙的奇技淫巧來實(shí)現(xiàn) cd 和 ls 序列作為別名,所以如果你足夠耐心,那么即使是一個(gè)簡單的別名也永無止限。
開始別名化和函數(shù)化吧
可以定制你的環(huán)境使得 Linux 變得如此有趣,提高效率使得 Linux 可以改變生活。開始使用簡單的別名,進(jìn)而使用函數(shù),并在評(píng)論中發(fā)布你必須擁有的別名!
via: https://opensource.com/article/19/7/bash-aliases
作者: Seth Kenlon 選題: lujun9972 譯者: wxy 校對(duì): wxy
本文由 LCTT 原創(chuàng)編譯, Linux中國 榮譽(yù)推出