Shell 點文件可以為你做點什麼
不要問你可以為你的 shell 點文件 做什麼,而是要問一個 shell 點文件可以為你做什麼!
我一直在操作系統領域裡面打轉,但是在過去的幾年中,我的日常使用的一直是 Mac。很長一段時間,我都在使用 Bash,但是當幾個朋友開始把 zsh 當成宗教信仰時,我也試試了它。我沒用太長時間就喜歡上了它,幾年後,我越發喜歡它做的許多小事情。
我一直在使用 zsh(通過 Homebrew 提供,而不是由操作系統安裝的)和 Oh My Zsh 增強功能。
本文中的示例是我的個人 .zshrc
。大多數都可以直接用在 Bash 中,我覺得不是每個人都依賴於 Oh My Zsh,但是如果不用的話你的工作量可能會有所不同。曾經有一段時間,我同時為 zsh 和 Bash 維護一個 shell 點文件,但是最終我還是放棄了我的 .bashrc
。
不偏執不行
如果你希望在各個操作系統上使用相同的點文件,則需要讓你的點文件聰明點。
### Mac 專用
if [[ "$OSTYPE" == "darwin"* ]]; then
# Mac 專用內容在此
例如,我希望 Alt + 箭頭鍵
將游標按單詞移動而不是單個空格。為了在 iTerm2(我的首選終端)中實現這一目標,我將此代碼段添加到了 .zshrc
的 Mac 專用部分:
### Mac 專用
if [[ "$OSTYPE" == "darwin"* ]]; then
### Mac 用於 iTerm2 的游標命令;映射 ctrl+arrows 或 alt+arrows 來快速移動
bindkey -e
bindkey '^[[1;9C' forward-word
bindkey '^[[1;9D' backward-word
bindkey 'ee[D' backward-word
bindkey 'ee[C' forward-word
fi
(LCTT 譯註:標題 「We』re all mad here」 是電影《愛麗絲夢遊仙境》中,微笑貓對愛麗絲講的一句話:「我們這兒全都是瘋的」。)
在家不工作
雖然我開始喜歡我的 Shell 點文件了,但我並不總是想要家用計算機上的東西與工作的計算機上的東西一樣。解決此問題的一種方法是讓補充的點文件在家中使用,而不是在工作中使用。以下是我的實現方式:
if [[ `egrep 'dnssuffix1|dnssuffix2' /etc/resolv.conf` ]]; then
if [ -e $HOME/.work ]
source $HOME/.work
else
echo "This looks like a work machine, but I can't find the ~/.work file"
fi
fi
在這種情況下,我根據我的工作 dns 後綴(或多個後綴,具體取決於你的情況)來提供(source
)一個可以使我的工作環境更好的單獨文件。
(LCTT 譯註:標題 「What about Bob?」 是 1991 年的美國電影《天才也瘋狂》。)
你該這麼做
現在可能是放棄使用波浪號(~
)表示編寫腳本時的主目錄的好時機。你會發現在某些上下文中無法識別它。養成使用環境變數 $HOME
的習慣,這將為你節省大量的故障排除時間和以後的工作。
如果你願意,合乎邏輯的擴展是應該包括特定於操作系統的點文件。
(LCTT 譯註:標題 「That thing you do」 是 1996 年由湯姆·漢克斯執導的喜劇片《擋不住的奇蹟》。)
別指望記憶
我寫了那麼多 shell 腳本,我真的再也不想寫腳本了。並不是說 shell 腳本不能滿足我大部分時間的需求,而是我發現寫 shell 腳本,可能只是拼湊了一個膠帶式解決方案,而不是永久地解決問題。
同樣,我討厭記住事情,在我的整個職業生涯中,我經常不得不在一天之中就徹徹底底地改換環境。實際的結果是這些年來,我不得不一再重新學習很多東西。(「等等……這種語言使用哪種 for 循環結構?」)
因此,每隔一段時間我就會覺得自己厭倦了再次尋找做某事的方法。我改善生活的一種方法是添加別名。
對於任何一個使用操作系統的人來說,一個常見的情況是找出佔用了所有磁碟的內容。不幸的是,我從來沒有記住過這個咒語,所以我做了一個 shell 別名,創造性地叫做 bigdirs
:
alias bigdirs='du --max-depth=1 2> /dev/null | sort -n -r | head -n20'
雖然我可能不那麼懶惰,並實際記住了它,但是,那不太 Unix ……
(LCTT 譯註:標題 「Memory, all alone in the moonlight」 是一手英文老歌。)
輸錯的人們
使用 shell 別名改善我的生活的另一種方法是使我免於輸入錯誤。我不知道為什麼,但是我已經養成了這種討厭的習慣,在序列 ea
之後輸入 w
,所以如果我想清除終端,我經常會輸入 cleawr
。不幸的是,這對我的 shell 沒有任何意義。直到我添加了這個小東西:
alias cleawr='clear'
在 Windows 中有一個等效但更好的命令 cls
,但我發現自己會在 Shell 也輸入它。看到你的 shell 表示抗議真令人沮喪,因此我添加:
alias cls='clear'
是的,我知道 ctrl + l
,但是我從不使用它。
(LCTT 譯註:標題 「Typos, and the people who love them」 可能來自某部電影。)
要自娛自樂
工作壓力很大。有時你需要找點樂子。如果你的 shell 不知道它顯然應該執行的命令,則可能你想直接讓它聳聳肩!你可以使用以下功能執行此操作:
shrug() { echo "¯_(ツ)_/¯"; }
如果還不行,也許你需要掀桌不幹了:
fliptable() { echo "(╯°□°)╯ ┻━┻"; } # 掀桌,用法示例: fsck -y /dev/sdb1 || fliptable
想想看,當我想掀桌子時而我不記得我給它起了個什麼名字,我會有多沮喪和失望,所以我添加了更多的 shell 別名:
alias flipdesk='fliptable'
alias deskflip='fliptable'
alias tableflip='fliptable'
而有時你需要慶祝一下:
disco() {
echo "(•_•)"
echo "<) )╯"
echo " / "
echo ""
echo "(•_•)"
echo " ( (>"
echo " / "
echo ""
echo " (•_•)"
echo "<) )>"
echo " / "
}
通常,我會將這些命令的輸出通過管道傳遞到 pbcopy
,並將其粘貼到我正在使用的相關聊天工具中。
我從一個我關注的一個叫 「Command Line Magic」 @ climagic 的 Twitter 帳戶得到了下面這個有趣的函數。自從我現在住在佛羅里達州以來,我很高興看到我這一生中唯一的一次下雪:
snow() {
clear;while :;do echo $LINES $COLUMNS $(($RANDOM%$COLUMNS));sleep 0.1;done|gawk '{a[$3]=0;for(x in a) {o=a[x];a[x]=a[x]+1;printf "