在操作 Linux 的過程中,最令你感到不爽的是什么?答:命令太多,選項太多,記不住。 命令可以通過本書學(xué)習(xí),但選項太多可真的不好辦了,我想即便是 Linux 大牛們,也不可能記住每個命令的所有選項吧。 幸好 Linux 系統(tǒng)中有一個叫作 alias 的命令,它可以給一些命令設(shè)置別名,利用它我們就可以不必記住太多復(fù)雜的選項,只需將這些選項設(shè)置成別名就好啦。 定義別名定義別名的方法很簡單,格式如下所示:alias [name[=value]] 這里需要注意的是:
了解了別名的基礎(chǔ)知識之后,我們來看一個定義別名的例子: [roc@roclinux ~]$ alias vi='vim'這個例子定義了一個 vim 命令的別名,以后,當(dāng)我們執(zhí)行 vi 命令時,其實真正執(zhí)行的是 vim 命令。是不是很簡單呢! 如何查看別名如果太熱衷于設(shè)置別名,那么你就會面臨著要記住很多別名的困擾,因此,學(xué)會查看所有已設(shè)置的別名,就顯得尤為重要了。查看別名的方法也很簡單,直接輸入 alias 命令,不加任何選項和參數(shù)即可: [roc@roclinux ~]$ alias alias cp='cp -i' alias l.='ls -d .* --color=auto' alias ll='ls -l --color=auto' alias ls='ls --color=auto' alias mv='mv -i' alias rm='rm -i' alias vi='vim' alias which='alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde' 可以看到,系統(tǒng)把當(dāng)前可用的所有的別名都列出來了。仔細(xì)找一下,是不是可以看到剛才設(shè)置的那個別名了:alias vi='vim'。 查看單獨命令的別名如果我們只想查看一個單獨命令是否設(shè)置了別名,那么方法有兩個。方法一:使用 alias 命令加參數(shù) [roc@roclinux ~]$ alias vi alias vi='vim' 方法二:使用快捷鍵 當(dāng)在終端中輸入一個命令后,按下 Ctrl+Alt+E 組合鍵,假如設(shè)置了別名,那么別名自動會變成實際的命令。 注意:這個快捷鍵并非在所有終端中都可行,有些終端的快捷鍵會和這個快捷鍵沖突,這樣的話,該方法就不好使了。 如何取消別名別名定義的太多了,往往帶來的不是方便,而是困擾。所以我們也需要掌握刪除別名的方法。那么,如何刪除一個別名呢?可以使用 unalias 命令。比如,我們想刪除 vi='vim' 這個別名,可以這樣來操作: #刪除別名設(shè)置 [roc@roclinux ~]$ unalias vi #再看看, 已經(jīng)被刪除了吧 [roc@roclinux ~]$ alias alias cp='cp -i' alias dirA='echo work directory is /root' alias dirB='echo work directory is $PWD' alias l.='ls -d .* --color=auto' alias ll='ls -l --color=auto' alias ls='ls --color=auto' alias mv='mv -i' alias rm='rm -i' alias which='alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde'經(jīng)過仔細(xì)觀察,確實已經(jīng)找不到剛才定義的 vi 別名了。 如果你想刪除所有的別名,直接使用 unalias 命令的-a選項即可,只不過要謹(jǐn)慎使用,避免你設(shè)置的所有的別名一下子都被清除了,自己還得一個一個重新設(shè)置回來。 #刪除所有別名 [roc@roclinux ~]$ unalias -a #空空如也 [roc@roclinux ~]$ alias 如何執(zhí)行命令本身而非別名別名雖好,但也有它的弊端,比如定義的別名恰好和某個命令重名了,這就麻煩了,Shell 中執(zhí)行的將永遠(yuǎn)都是別名。這里,如果我們想執(zhí)行真正的那個命令而非別名,該怎么辦呢?有三種方法可以解決這個問題:
下面我們就通過示例來演示這三個方法: #絕對路徑方法 [roc@roclinux ~]$ /bin/vi test.sh #明確指定當(dāng)前路徑的方法 [roc@roclinux ~]$ cd /bin [roc@roclinux bin]$ ./vi ~/test.sh #使用反斜線的方法 [roc@roclinux bin]$ cd [roc@roclinux ~]$ \vi test.sh這里推薦大家使用最后一種方法,因為它既方便又實用。 如何讓別名永久有效我們通過 alias 命令設(shè)置的別名,僅限于在當(dāng)前的 Shell 中使用,如果系統(tǒng)重啟了,那么新設(shè)置的別名就失效了。如果想讓別名永久有效的話,就需要把所有的別名設(shè)置方案加入到($HOME)目錄下的 .alias 文件中(如果系統(tǒng)中沒有這個文件,你可以創(chuàng)建一個),然后在 .bashrc 文件中增加這樣一段代碼: # Aliases if [ -f ~/.alias ]; then . ~/.alias fi這樣設(shè)置后,無論怎樣重啟系統(tǒng),都不會影響設(shè)置的別名啦。 單引號和雙引號的困惑在別名的應(yīng)用中,單引號和雙引號的使用是比較容易造成困惑的,請看下面的示例:[root@roclinux ~]$ echo $PWD /root [root@roclinux ~]$ alias dirA="echo work directory is $PWD" [root@roclinux ~]$ alias dirB='echo work directory is $PWD' # 正確顯示 [root@roclinux ~]$ dirA work directory is /root # 正確顯示 [root@roclinux ~]$ dirB work directory is /root # 顯示不正確, 怎么回事? [root@roclinux ~]$ cd / [root@roclinux /]$ dirA work directory is /root # 正確顯示 [root@roclinux /]$ dirB work directory is / 上面的程序最讓人困惑的是,別名中使用了 Shell 的系統(tǒng)變量 $PWD 來顯示當(dāng)前的目錄路徑,但當(dāng)目錄切換了之后,單引號的別名可以正常顯示,而雙引號的別名卻無法正常顯示了,這和我們使用 bash 的變量的經(jīng)驗正好相反。這是怎么回事呢? 其實問題的本質(zhì)在于,別名只是用來替代我們設(shè)置的命令。 下面就來看看 dirA 和 dirB 背后的真實面容: [roc@roclinux ~]$ alias dirA alias dirA="echo work directory is /root" [roc@roclinux ~]$ alias dirB alias dirB='echo work directory is $PWD' 看到了吧,使用雙引號的 dirA,通過 Shell 的變量轉(zhuǎn)換后已經(jīng)變成了字符串 echo work directory is/root,當(dāng)目錄切換后,當(dāng)然還是顯示字符串的內(nèi)容。而使用單引號的 dirB,由于不受 Shell 的影響,仍然保留著原來的設(shè)置 echowork directory is$PWD,當(dāng)切換目錄后再執(zhí)行,變量 $PATH 被 Shell 替換掉,因此,內(nèi)容被正確顯示了。 在 Shell 腳本中執(zhí)行別名的困惑在 Shell 腳本中,alias 別名功能默認(rèn)是關(guān)閉的,如果將 alias 別名編寫到腳本中,而此時 Shell 內(nèi)置命令和 PATH 中均沒有與 alias 別名同名的命令,則 Shell 會“抱怨”找不到指定的命令。就像下面的例子中展示的一樣:[roc@roclinux ~]$ cat test.sh #!/bin/bash ll [roc@roclinux ~]$ ./test.sh ./test.sh: line 3: ll: command not found 有沒有辦法在 Shell 腳本中啟用 alias 別名功能呢?答案是有的,那就是使用 Shell 內(nèi)置的 shopt 命令來開啟 alias 別名擴(kuò)展選項 expand_aliases。我們現(xiàn)在就來試驗一下: [roc@roclinux ~]$ shopt -s expand_aliases [roc@roclinux ~]$ shopt expand_aliases expand_aliases on [roc@roclinux ~]$ ./test.sh ./test.sh: line 3: ll: command not found 悲劇,怎么還是提示同樣的錯,難道被忽悠了?不急,我們來分析一下,找出問題的原委: [roc@roclinux ~]$ cat test.sh #!/bin/bash shopt expand_aliases ll [roc@roclinux ~]$ ./test.sh expand_aliases off ./test.sh: line 5: ll: command not found 從我們的試驗中可以看出,上面程序執(zhí)行失敗的原因是:雖然在 Shell 中 expand_aliases 是 on 狀態(tài),但當(dāng)執(zhí)行 test.sh 時,會產(chǎn)生一個新的進(jìn)程去執(zhí)行,這個新的進(jìn)程中 expand_aliases 卻是 off 的狀態(tài)。 知道了這個原因,我們做出相應(yīng)修改,繼續(xù)試驗: [roc@roclinux ~]$ cat test.sh #!/bin/bash shopt expand_aliases shopt -s expand_aliases shopt expand_aliases ll [roc@roclinux ~]$ ./test.sh expand_aliases off expand_aliases on ./test.sh: line 8: ll: command not found 這一次我們在腳本中強(qiáng)制把 expand_aliases 設(shè)置為 on 狀態(tài),這次應(yīng)該沒有問題了吧。但事與愿違,別名在腳本中仍然不生效。 作為一名合格的工程師,我們要有打破砂鍋問到底的精神,控制住幾近崩潰的情緒,我們繼續(xù)做試驗: [roc@roclinux ~]$ cat test.sh #!/bin/bash ## shopt expand_aliases shopt -s expand_aliases shopt expand_aliases alias ll [roc@roclinux ~]$ ./test.sh expand_aliases off expand_aliases on ./test.sh: line 10: ll: command not found又發(fā)現(xiàn)了新情況,alias 命令竟然沒有輸出任何內(nèi)容!這還是執(zhí)行程序時新生成進(jìn)程的問題。從現(xiàn)象來看,應(yīng)該是腳本中的 alias 沒有繼承 Shell 中 alias 的設(shè)置內(nèi)容。 不賣關(guān)子啦,我們揭曉最終的答案,解決方法是使用 bash 的 --login 選項: [roc@roclinux ~]$ cat test.sh #!/bin/bash --login ## shopt expand_aliases shopt -s expand_aliases shopt expand_aliases alias ll [roc@roclinux ~]$ ./test.sh expand_aliases off expand_aliases on alias list is alias cp='cp -i' alias l.='ls -d .*' alias ll='ls -l' alias mv='mv -i' alias rm='rm -i' alias which='alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde' total 12 -rw-r--r-- 1 roc roc 740 Feb 5 16:21 cat.time.txt -rwxr--r-- 1 roc roc 131 Feb 6 17:15 test1.sh -rwxr--r-- 1 roc roc 121 Feb 6 17:45 test.sh功夫不負(fù)有心人,這次終于執(zhí)行成功了! bash 的 --login 選項的作用是使執(zhí)行腳本的子 Shell 成為一個 login Shell,而 login Shell 就會讀取系統(tǒng)和用戶的 profile 及 rc 文件,這樣就會順理成章地加載到 alias 的初始設(shè)置啦。 |
|