【正文】
長(zhǎng)。第六篇:命令的別名、Shell 函數(shù)/從這裏出發(fā)/Shell 常見問題命令的別名、Shell 函數(shù)記住所有的命令及各自帶的可選項(xiàng),然後每次一一輸入,這確實(shí)有點(diǎn)枯燥。但幸運(yùn)的是,您可以為常用命令定義快捷方式。這些快捷方式可以用較簡(jiǎn)單的命令別名(alias),或複雜一些的 shell 函數(shù)的語(yǔ)法來(lái)定義。命令的別名例如,我用下面的命令來(lái)上傳 MUO 中的文件:rsync e ssh z t r vv progress /home/tom/web/muo/rsmuo/docs muo://mandrakeuser/docs顯然,如果每次都要逐一輸入,那我早晚會(huì)變成木頭。因此我在39。~/.bashrc39。中定義了別名:alias upmuo=39。rsync e ssh z t r vv progress /home/tom/web/muo/rsmuo/docs muo://mandrakeuser/docs39?,F(xiàn)在,我只要輸入 upmuo 就可以完成上傳任務(wù)了。定義別名的語(yǔ)法是:alias shortcut=39。mand39。命令中有空格的話 ,就需要用引號(hào)(如在命令與可選項(xiàng)間就有空格)。請(qǐng)注意,您可以用單引號(hào)或雙引號(hào),但他們是有區(qū)別的。單引號(hào)將剝奪其中的所有字元的特殊含義,而雙引號(hào)中的39。$39。(參數(shù)替換)和39。`39。(命令替換)是例外。這意味著,如果您想在別名中應(yīng)用變數(shù)或命令的替換,就得用雙引號(hào)??匆幌律厦娴睦?,我在39。.bashrc39。中定義了一個(gè)稱為 MUOHOME 的變數(shù):export MUOHOME=$HOME/web/muo/rsmuo/docs要在上面的別名中用上這個(gè)變數(shù),我就必須用雙引號(hào):alias upmuo=rsync e ssh z t r vv progress $MUOHOME muo://mandrakeuser/docs否則,別名將查找一個(gè)名為39。$MUOHOME39。的目錄或檔。您可以用39。alias39。在命令行快速地創(chuàng)建別名,或?qū)⒚罘诺礁髯缘?9。~/.bashrc39。,或放到系統(tǒng)級(jí)的39。/etc/39。中(而在 Mandrake Linux 8 以前的版本裏,用的是39。/etc/bashrc39。)。要?jiǎng)h除一個(gè)別名,只要輸入:unalias alias 。運(yùn)行 alias 將列出您系統(tǒng)中所有定義的別名。如果看一下39。~/.bashrc39。和39。/etc/39。,您會(huì)發(fā)現(xiàn)系統(tǒng)已經(jīng)定義了一些別名。您可以為同一個(gè)命令定義多個(gè)別名。當(dāng)然,您得先確認(rèn)別名與其他程式名不同,比如象 alias rm=39。ls l39。 這樣的就不能工作。您可以在命令行輸入這些快捷方式,測(cè)試一下。如果 shell 找不到相同名稱的命令,那您就可以將其用作別名了。以下別名可能有用(不要忘了引號(hào)!) :l alias rpmq=39。rpm qa | grep39。 :現(xiàn)在 rpmq string 就將列出所有名稱中含有 string 的已安裝 RPM 包,l alias ls=39。ls ho color | more39。 :ls 將以彩色分頁(yè)方式列出檔,檔大小以 KB為單位,l alias use=39。du maxdepth=1 | sort n | more39。 :use 將子目錄按大小排好,並以分頁(yè)方式列出,目錄的別名也可以是可移動(dòng)的介質(zhì):alias dlm=39。/mnt/cdrom/RedHat/RPMS/39。 。提示:將有相似功能的別名以相同字母開頭,比如將所有目錄的別名以39。d39。作開頭,這樣有助於記憶。我相信,您將會(huì)用到這些功能。Shell 函數(shù)寫 shell 函數(shù)涉及到了 shell 腳本,這超出了我們討論的範(fàn)圍(也不在我的掌握範(fàn)圍之內(nèi) 。))。事實(shí)上,shell 函數(shù)屬於 shell 腳本,但可以在同一 shell 下被預(yù)載入(preload)和執(zhí)行(而一般的 shell 腳本至少要打開一個(gè) subshell)。通過 shell 函數(shù),您可以做很多 aliases 無(wú)法完成的事情。下面就是一個(gè)例子:function apros() { apropos | egrep v 39。(3|/(n/)39。 }定義了一個(gè)新命令,稱為39。apros39。apros name 將先執(zhí)行39。apropos name39。(即在 man page 中搜索命令),然後將得到的輸出送到管道(|),接著用39。egrep39。過濾,排除第39。339。和第39。n39。章節(jié)的 man page ,這個(gè)命令可能沒什麼大用處,但可以整理39。apropos39。命令的輸出。函數(shù)允許您在函數(shù)內(nèi)部任何位置,使用運(yùn)行時(shí)的參數(shù)。而別名,則只允許在命令行尾放一個(gè)參數(shù)(比如前面的別名39。rpmq39。)。39。39。就是位置參數(shù)(positional parameter),表示函數(shù)第一個(gè)參數(shù)的位置識(shí)別字。依此類推,還有39。39。等。function apros() { apropos | egrep v /(。 }如果您這樣運(yùn)行39。apros39。命令:apros name man_section_number這個(gè)命令將搜索標(biāo)題中含 name 的 man pages ,但排除 man_section_number 部分:apros menu 3將搜索標(biāo)題含39。menu39。的 man page ,但排除第三章節(jié)(關(guān)於編程的)。注意到您得引用(quote) 兩次,而且還用到了雙引號(hào):l 您必須引用39。egrep39。的搜索模式,這樣可以不至於被 shell 誤解。l 您必須用雙引號(hào),這樣第二個(gè)參數(shù)才能被正確解釋。l 您必須引用圓括號(hào),這樣使39。egrep39。按字面意思對(duì)待對(duì)待參數(shù)。是不是有點(diǎn)意思?。)shell 函數(shù)的處理類似於別名:將其放到您的39。.bashrc39。檔,這樣就能永久生效了。從這裏出發(fā)我們談到的只是 shell 的一個(gè)開頭。掌握了shell 腳本,您就可以做很多事情,比如將任務(wù)自動(dòng)化,糾正別人腳本中的錯(cuò)誤,按照您的習(xí)慣定制 Linux 系統(tǒng)。如果您打算學(xué)習(xí)某種複雜的編程語(yǔ)言,那 shell 腳本也是一個(gè)很好的開端,因?yàn)榛靖拍疃际穷愃频?。BASH Programming Introduction HOWTO:將更深入這些主題,並且將把您帶到 shell 編程的世界。然後可以繼續(xù)閱讀我強(qiáng)烈推薦的 Advanced BashScripting Guide(),作者是 Mendel Cooper 。如果您偏好紙書,那我推薦 S. Veeraraghavan 的《Teach Yourself Shell Programming》,Sams 出版社。我倒覺得 O39。Reilly 公司由 Newham/Rosenblatt 寫的《Learning the bash Shell》,不過爾爾,但這可能只有我這麼看 。) 。除了這些,就是練習(xí),練習(xí),再練習(xí)。閱讀其他人寫的 shell 腳本,看看他們?cè)谧鍪颤N,怎麼做,為什麼那樣做。請(qǐng)不要用39。root39。測(cè)試您的腳本。Have fun 。收集Shell的一些小問題發(fā)表在Shell於 20061112 收集Shell的一些小問題,以方便今後查閱。 獲得當(dāng)前目錄名dingyi@backup:/etc/$ pwd/etc/dingyi@backup:/etc/$ basename /etc/dingyi@backup:/etc/$ echo $PWD |awk F/ 39。{print $NF}39。 獲得之前某段時(shí)間的日期date +%Y%m%d d 2 day agodate +%Y%m%d d 2 week agodate +%Y%m%d d 2 month agodate +%Y%m%d d 2 year agodate d last sunday +%Y%m%d不寫ago,就可以得到2天或者2周以後的日期date d sunday +%Y%m%d這樣得到的就是下個(gè)周日的日期了。 set a fancy prompt PS1=39。/u@/h:/w$ 39。 cd () { builtin cd $@ es=$? [ $es eq 0 ] amp。amp。 echo $OLDPWD $PWD return $es } 效果如下:dingyi@backup:~$ cd /etc//home/dingyi /etc改變ls l顯示的日期ls l timestyle=+%Y%m%drwxrxrx 1 dingyi dingyi 3247 20050820 shell基礎(chǔ)三和四:後臺(tái)(crontab,at,amp。,nohup)及(*,?,[]等)發(fā)表在Shell於 20061112 設(shè)置c r o n t a b文件,並用它來(lái)提交作業(yè)。 ? 使用a t命令來(lái)提交作業(yè)。 ? 在後臺(tái)提交作業(yè)。 ? 使用n o h u p命令提交作業(yè)。 名詞解釋: cron:系統(tǒng)調(diào)度進(jìn)程。可以使用它在每天的非高峰負(fù)荷時(shí)間段運(yùn)行作業(yè),或在一周或一月中的不同時(shí)段運(yùn)行。 At at命令:使用它在一個(gè)特定的時(shí)間運(yùn)行一些特殊的作業(yè),或在晚一些的非負(fù)荷高峰時(shí)間段或高峰負(fù)荷時(shí)間段運(yùn)行。 amp。:使用它在後臺(tái)運(yùn)行一個(gè)佔(zhàn)用時(shí)間不長(zhǎng)的進(jìn)程。 Nohup:用它在後臺(tái)運(yùn)行一個(gè)命令,即使在用戶退出時(shí)也不受影響cron和crontab c r o n是系統(tǒng)主要的調(diào)度進(jìn)程,可以在無(wú)需人工幹預(yù)的情況下運(yùn)行作業(yè)。c r o n t a b命令允許用戶提交、編輯或刪除相應(yīng)的作業(yè)。每一個(gè)用戶都可以有一個(gè)c r o n t a b檔來(lái)保存調(diào)度資訊。可以使用它運(yùn)行任意一個(gè)s h e l l腳本或某個(gè)命令,每小時(shí)運(yùn)行一次,或一週三次,這完全取決於你。每一個(gè)用戶都可以有自己的c r o n t a b檔,但在一個(gè)較大的系統(tǒng)中,系統(tǒng)管理員一般會(huì)禁止這些檔,而只在整個(gè)系統(tǒng)保留一個(gè)這樣的檔。系統(tǒng)管理員是通過c r o n . d e n y和c r o n . a l l o w這兩個(gè)檔來(lái)禁止或允許用戶擁有自己的c r o n t a b檔。 crontab的域 為了能夠在特定的時(shí)間運(yùn)行作業(yè),需要瞭解c r o n t a b檔每個(gè)條目中各個(gè)域的意義和格式。