厭倦了一遍又一遍地輸入相同的長命令?你以爲在命令行上工做效率低嗎?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