Linux Shell的父子關系及內建命令
Shell的類型
系統啟動什么樣的shell程序取決於你個人的用戶ID配置。在/etc/passwd文件中,在用戶ID記錄的第7個字段中列出了默認的shell程序。只要用戶登錄到某個虛擬控制台終端或是在GUI中啟動終端仿真器,默認的shell程序就會開始運行。
在下面的例子中,用戶xiaoyu使用了GNU bash shell作為自己的默認shell程序:
1 xiaoyu@Admin:/$ cat /etc/passwd
2 [...] 3 xiaoyu:x:1000:1000:xiaoyu,,,:/home/xiaoyu:/bin/bash
bash shell程序位於/bin目錄內。從長列表中可以看出/bin/bash(bash shell)是一個可執行程序:
1 xiaoyu@Admin:/$ ls -lF /bin/bash 2 -rwxr-xr-x 1 root root 1037528 5月 16 2017 /bin/bash*
Shell的父子關系
1 xiaoyu@Admin:/$ ps -f 2 UID PID PPID C STIME TTY TIME CMD 3 xiaoyu 2448 2441 0 21:32 pts/1 00:00:00 bash 4 xiaoyu 3772 2448 0 22:38 pts/1 00:00:00 ps -f 5 xiaoyu@Admin:/$
1 xiaoyu@Admin:/$ bash 2 xiaoyu@Admin:/$ ps -f 3 UID PID PPID C STIME TTY TIME CMD 4 xiaoyu 2448 2441 0 21:32 pts/1 00:00:00 bash 5 xiaoyu 3781 2448 0 22:39 pts/1 00:00:00 bash 6 xiaoyu 3791 3781 0 22:39 pts/1 00:00:00 ps -f 7 xiaoyu@Admin:/$
第一次使用ps -f的時候,顯示出了兩個進程。其中一個進程的進程ID是2448(第二列),運行的是bash shell程序(最后一列)。另一個進程(進程ID為3772)對應的命令是ps -f。
說明:進程就是正在運行的程序。bash shell是一個程序,當它運行的時候,就成為了一個進程。一個運行着的shell就是某種進程而已。因此,在說到運行一個bash shell的時候,你經常會看到"shell"和”進程“這兩個詞交換使用。
在輸入命令bash之后,一個子shell就出現了。第二個ps -f是在子shell中執行的。可以從顯示結果中看到有兩個bash shell在運行。第一個bash shell程序,也就是父shell進程,其原始進程ID是2448。第二個bash shell程序,即子shell進程,其PID是3781。注意:子shell的父進程ID(PPID)是2448,指明了這個父shell就是該子shell的父進程。下圖展示了這種關系。
在生成子shell進程時,只有部分父進程的環境被復制到子shell環境中。這會對包括變量在內的一些東西造成影響,后面我們會聊到這個。
子shell(child shell,也叫subshell)可以從父shell中創建,也可以從另一個子shell中創建。
1 xiaoyu@Admin:/$ bash 2 xiaoyu@Admin:/$ 3 xiaoyu@Admin:/$ bash 4 xiaoyu@Admin:/$ 5 xiaoyu@Admin:/$ bash 6 xiaoyu@Admin:/$ 7 xiaoyu@Admin:/$ 8 xiaoyu@Admin:/$ ps --forest 9 PID TTY TIME CMD 10 2448 pts/1 00:00:00 bash 11 3781 pts/1 00:00:00 \_ bash 12 3973 pts/1 00:00:00 \_ bash 13 3989 pts/1 00:00:00 \_ bash 14 3999 pts/1 00:00:00 \_ bash 15 4035 pts/1 00:00:00 \_ ps
16 xiaoyu@Admin:/$
在上面的例子中,bash命令被輸入了三次。這實際上創建了三個子shell(上面那步中我們已經輸入一次bash,因此顯示有4個)。ps --forest命令展示了這些子shell間的嵌套結構。下圖展現了這種關系。
ps -f命令也能夠表現子shell的嵌套關系,因為它能夠通過PPID列顯示出誰是誰的父進程。
1 xiaoyu@Admin:/$ ps -f 2 UID PID PPID C STIME TTY TIME CMD 3 xiaoyu 2448 2441 0 21:32 pts/1 00:00:00 bash 4 xiaoyu 3781 2448 0 22:39 pts/1 00:00:00 bash 5 xiaoyu 3973 3781 0 22:49 pts/1 00:00:00 bash 6 xiaoyu 3989 3973 0 22:49 pts/1 00:00:00 bash 7 xiaoyu 3999 3989 0 22:49 pts/1 00:00:00 bash 8 xiaoyu 4102 3999 0 22:54 pts/1 00:00:00 ps -f 9 xiaoyu@Admin:/$
可以輸入man bash程序可使用命令行參數修改shell啟動方式。下表列舉了bash中可用的命令行參數。
參數 | 描述 |
-c string | 從string中讀取命令並進行處理 |
-i | 啟動一個能夠接收用戶輸入的交互shell |
-I | 以登錄shell的形式啟動 |
-r | 啟動一個受限shell,用戶會被限制在默認目錄中 |
-s | 從標准輸入中讀取命令 |
可以輸入man bash獲得關於bash命令的更多幫助信息,了解更多的命令行參數。bash --help命令也提供一些額外的協助。
可以利用exit命令油條不紊地退出子shell。
1 xiaoyu@Admin:/$ exit 2 exit 3 xiaoyu@Admin:/$ ps --forest 4 PID TTY TIME CMD 5 2448 pts/1 00:00:00 bash 6 3781 pts/1 00:00:00 \_ bash 7 3973 pts/1 00:00:00 \_ bash 8 3989 pts/1 00:00:00 \_ bash 9 4205 pts/1 00:00:00 \_ ps
10 xiaoyu@Admin:/$ 11 xiaoyu@Admin:/$ exit 12 exit 13 xiaoyu@Admin:/$ ps --forest 14 PID TTY TIME CMD 15 2448 pts/1 00:00:00 bash 16 3781 pts/1 00:00:00 \_ bash 17 3973 pts/1 00:00:00 \_ bash 18 4218 pts/1 00:00:00 \_ ps
19 xiaoyu@Admin:/$ 20 xiaoyu@Admin:/$ exit 21 exit 22 xiaoyu@Admin:/$ 23 xiaoyu@Admin:/$ ps --forest 24 PID TTY TIME CMD 25 2448 pts/1 00:00:00 bash 26 3781 pts/1 00:00:00 \_ bash 27 4227 pts/1 00:00:00 \_ ps
28 xiaoyu@Admin:/$ exit 29 exit 30 xiaoyu@Admin:/$ ps --forest 31 PID TTY TIME CMD 32 2448 pts/1 00:00:00 bash 33 4230 pts/1 00:00:00 \_ ps
34 xiaoyu@Admin:/$
exit命令不僅能退出子shell,還能用來登出當前的虛擬控制台終端或終端仿真器軟件。只需要在父shell中輸入exit,就能夠從容退出CLI了。
運行shell腳本也能夠創建出子shell。
就算是不使用bash shell命令或是運行shell腳本,你也可以生成子shell。一種方法就是使用進程列表。
進程列表
可以在一行中指定要依次運行的一系列命令。這可以通過命令列表來實現,只需要在命令之間加入分號(;)即可。
1 xiaoyu@Admin:/$ pwd; ls; cd /etc; pwd; cd ; pwd; ls
2 /
3 bin cdrom dev home initrd.img.old lib64 media opt root sbin srv tmp var 4 boot core etc initrd.img lib lost+found mnt proc run snap sys usr vmlinuz 5 /etc 6 /home/xiaoyu 7 Desktop Documents Downloads examples.desktop Music Pictures Public Templates Videos 8 xiaoyu@Admin:~$
上面這個例子中,所有的命令依次執行,不存在任何問題。不過這並不是進程列表。命令列表想要成為進程列表,這些命令必須包含在括號里。
1 xiaoyu@Admin:~$ (pwd; ls; cd /etc; pwd; cd ; pwd; ls) 2 /home/xiaoyu 3 Desktop Documents Downloads examples.desktop Music Pictures Public Templates Videos 4 /etc 5 /home/xiaoyu 6 Desktop Documents Downloads examples.desktop Music Pictures Public Templates Videos 7 xiaoyu@Admin:~$
盡管多出來的括號看起來沒有上面太大的不同,但起到的效果確實非同尋常。括號的加入使命令列表變成了進程列表,生成了一個子shell來執行對應的命令。
說明:進程列表是一種命令分組(command grouping)。另一種命令分組是將命令放入花括號中,並在命令列表尾部加入分號(;)。語法為{command;}。使用花括號進行命令分組並不會像進程列表那樣創建出子shell。
要想知道是否生成了子shell,得借助一個使用了環境變量的命令(環境變量會在下一篇博文中寫)。這個命令就是echo $BASH_SUBSHELL。如果該命令返回0,就表明沒有子shell。如果返回1或者更大其他數字,就表明存在子shell。
下面的例子中使用了一個命令列表,列表尾部是echo $BASH_SUBSHELL。
1 xiaoyu@Admin:~$ pwd; ls; cd /etc; pwd; cd ; pwd; ls; echo $BASH_SUBSHELL 2 /home/xiaoyu 3 Desktop Documents Downloads examples.desktop Music Pictures Public Templates Videos 4 /etc 5 /home/xiaoyu 6 Desktop Documents Downloads examples.desktop Music Pictures Public Templates Videos 7 0
在命令輸出的最后,顯示的數字是0。這就表明這些命令不是在子shell中運行的。
要是使用進程列表的話,結果就不一樣了。在列表最后加入echo $BASH_SUBSHELL。
1 xiaoyu@Admin:~$ (pwd; ls; cd /etc; pwd; cd ; pwd; ls; echo $BASH_SUBSHELL) 2 /home/xiaoyu 3 Desktop Documents Downloads examples.desktop Music Pictures Public Templates Videos 4 /etc 5 /home/xiaoyu 6 Desktop Documents Downloads examples.desktop Music Pictures Public Templates Videos 7 1
8 xiaoyu@Admin:~$
這次在命令輸入的最后顯示了1。這表明的確創建了子shell,並用於執行這些命令。
所以說,命令列表就是使用花括號包圍起來的一組命令,它能創建出子shell來執行這些命令。
1 xiaoyu@Admin:~$ (pwd; echo $BASH_SUBSHELL) 2 /home/xiaoyu 3 1
4 xiaoyu@Admin:~$ (pwd; (echo $BASH_SUBSHELL)) 5 /home/xiaoyu 6 2
7 xiaoyu@Admin:~$
注意:在第一個進程列表中,數字1表明了一個子shell,這個結果和預期的一樣。但是在第二個進程列表中,在命令echo $BASH_SUBSHELL外面又多出了一對括號。這對括號在子shell中產生了另一個子shell來執行命令。因此數字2表明的就是這個子shell。
在shell腳本中,經常使用子shell進行多進程處理。但是采用子shell的成本不菲,會明顯拖慢處理速度。在交互式的CLI會話中,子shell同樣存在問題。它並非真正的多進程處理,因為終端控制着shell的I/O。
別出心裁的子shell用法
在交互式的shell CLI用法,還有很多更富有成效的子shell用法。進程列表、協程和管道都利用了子shell。他們都可以有效地交互式shell中使用。
在交互式shell中,一個高效地子shell用法就是使用后台模式。在討論如果將后台模式與子shell搭配使用之前,你得先搞明白什么是后台模式。
1、探索后台模式
在后台模式中運行命令命令可以在處理命令地同時讓出CLI,以供它用。演示后台模式地一個經典命令就是sheep。
sleep命令接受一個參數,該參數是你希望進程等待(睡眠)地秒數。這個命令在腳本中常用於引入一段時間地暫停。命令sleep 10會將會話暫停10秒鍾,然后返回shell CLI提示符。
要想將命令置入后台模式,可以在命令末尾加上字符&。把sheep命令置入后台模式可以讓我們利用ps命令查看一番
1 xiaoyu@Admin:~$ sleep 10
2 xiaoyu@Admin:~$ 3 xiaoyu@Admin:~$ sleep 3600&
4 [1] 5190
5 xiaoyu@Admin:~$ ps -f 6 UID PID PPID C STIME TTY TIME CMD 7 xiaoyu 2448 2441 0 21:32 pts/1 00:00:00 bash 8 xiaoyu 5190 2448 0 23:50 pts/1 00:00:00 sleep 3600
9 xiaoyu 5191 2448 0 23:51 pts/1 00:00:00 ps -f 10 xiaoyu@Admin:~$
sleep命令會在后台(&)睡眠3000秒(50分鍾)。當它被置入后台,在shell CLI提示符返回之前,會出現兩條信息。第一條信息是顯示在方括號總地后台作業(background job)號(1).第二條是后台作業地進程ID(5190)。
ps命令用來顯示各種進程。我們可以注意到命令sleep 3000已經被列出來了。在第二列顯示的進程ID(PID)和命令進入后台時所顯示PID是一樣的,都是5190。
除了ps命令,你也可以使用jobs命令來顯示后台作業信息。jobs命令可以顯示出當前運行在后台模式中的所有用戶的進程(作業)。
1 xiaoyu@Admin:~$ jobs 2 [1]+ Running sleep 3600 &
3 xiaoyu@Admin:~$
jobs命令在方括號中顯示出作業號(1).它還顯示了作業的當前狀態(running)以及對應的命令(sleep 3000&)。
利用jobs命令的-l(字母L的小寫形式)選項,你還能夠看到更多的相關信息。除了默認信息之外,-l選項還能夠顯示出命令的PID。
1 xiaoyu@Admin:~$ jobs -l 2 [1]+ 5190 Running sleep 3600 &
3 xiaoyu@Admin:~$
一旦后台作業完成,就會顯示出結束狀態。
1 xiaoyu@Admin:~$ sleep 5&
2 [2] 5435
3 xiaoyu@Admin:~$ jobs -l 4 [1]- 5190 Running sleep 3600 &
5 [2]+ 5435 Done sleep 5
6 xiaoyu@Admin:~$
需要提醒的是:后台作業的結束狀態可未必會一直等待到合適的時候才現身。當作業結束狀態突然出現在屏幕上的時候,你可別吃驚。
后台模式非常方便,它可以讓我們在CLI中創建出有實用價值的子shell。
2、將進程列表置入后台
進程列表是運行在子shell中的一條或多條命令。使用包含了sleep命令的進程列表,並顯示出變量BASH_SUBSHELL,結果和期望的一樣
1 xiaoyu@Admin:~$ (sleep 2; echo $BASH_SUBSHELL; sleep 2) 2 1
3 xiaoyu@Admin:~$
在上面的例子中,有一個2秒鍾的暫停,顯示出的數字表明只有一個子shell,在返回提示符之前又經歷了另一個2秒鍾的暫停。沒什么大事。
將相同的進程列表置入后台模式會在命令輸出上表現出些許不同。
1 xiaoyu@Admin:~$ (sleep 2; echo $BASH_SUBSHELL; sleep 2)&
2 [1] 4498
3 xiaoyu@Admin:~$ 1
4
5 xiaoyu@Admin:~$ ps -f 6 UID PID PPID C STIME TTY TIME CMD 7 xiaoyu 2906 2899 0 10:23 pts/6 00:00:00 bash 8 xiaoyu 4510 2906 0 11:45 pts/6 00:00:00 ps -f 9 [1]+ Done ( sleep 2; echo $BASH_SUBSHELL; sleep 2 ) 10 xiaoyu@Admin:~$
把進程列表置入后台會產生一個作業號和進程ID,然后返回到提示符。不過奇怪的是表明單一級子shell的數字1顯示在了提示符的旁邊!不要不知所措,只需要按一下回車鍵,就會得到另一個提示符。
在CLI中運用子shell的創造性方法之一就是將進程列表置入后台模式。你既可以在子shell中進行繁重的處理工作,同時也不會讓子shell的I/O受制於終端。
sleep和echo命令的進程列表只是作為示例,使用tar創建備份文件是有效利用后台進程列表的一個更實用的例子。
1 xiaoyu@Admin:~$ (tar -cvf music.tar Music/; tar -cvf video.tar Videos/)&
2 [1] 4820
3 xiaoyu@Admin:~$ Music/
4 Videos/
5
6 [1]+ Done ( tar -cvf music.tar Music/; tar -cvf video.tar Videos/ ) 7 xiaoyu@Admin:~$
將進程列表置入后台模式並不是子shell在CLI中僅有的創造性方法。協程就是另一種方法。
3、協程
協程可以同時做兩件事情。它在后台生成一個子shell,並在這個子shell中執行命令。
要進行協程處理,得使用coproc命令,還有要在子shell中執行的命令。
1 xiaoyu@Admin:~$ coproc sleep 10
2 [1] 49403
3 xiaoyu@Admin:~$ jobs 4 [1]+ Running coproc COPROC sleep 10 &
5 xiaoyu@Admin:~$
除了會創建子shell之外,協程基本上就是將命令置入后台模式。當輸入coproc命令及其參數之后,你會發現啟用了一個后台作業。屏幕上會顯示出后台作業號(1)以及進程ID(49403)。
jobs命令能夠顯示出協程的處理狀態。
從上面的例子中可以看到子shell中執行的后台命令是coproc COPROC sleep 10。COPROC是coproc命令給進程起的名字。你可以使用命令的擴展語法自己設置這個名字。
1 xiaoyu@Admin:~$ coproc my_jobs { sleep 10; } 2 [1] 49556
3 xiaoyu@Admin:~$ jobs 4 [1]+ Running coproc my_jobs { sleep 10; } &
5 xiaoyu@Admin:~$
通過擴展語法,協程的名字被設置為my_jobs。需要注意:大括號{}之間,前后都有一個空格,而且命令以分號;結束。
協程能夠讓我們盡情發揮想象力,發送或接受來自子shell中進程的信息。只有在擁有多個協程的時候才需要對協程進行命名,因為我們需要和它們進行通信。否則的話,讓coproc命令將其設置成默認的名字coproc就行了。
可以盡情發揮,將協程與進程列表結合起來產生嵌套的子shell。只需要輸入進程列表,然后把命令coproc放在前面就行了。
1 xiaoyu@Admin:~$ coproc friends { sleep 10; sheep 2; } 2 [1] 49667
3 xiaoyu@Admin:~$ jobs 4 [1]+ Running coproc friends { sleep 10; sheep 2; } &
5 xiaoyu@Admin:~$
Remember:生成子shell的成本不低,而且速度還慢。創建嵌套子shell更是火上澆油!
在命令中使用子shell能夠獲得靈活性和便利。要想獲得這些優勢,重要的是理解子shell的行為方式。對於命令也是如此,下面我們將看看內建命令與外部命令之間的行為差異。
理解shell的內建命令
弄明白shell內建命令和非內建(外部)命令非常重要。內建命令和非內建命令的操作方式大不相同。
外部命令
外部命令,有時候也被稱為文件系統命令,是存在於bash shell之外的程序。它們並不是shell程序的一部分。外部命令程序通常位於/bin、/usr/bin、/sbin、/usr/sbin中。
ps就是一個外部命令。可以使用which和type命令找到它。
1 xiaoyu@Admin:~$ which ps
2 /bin/ps
3 xiaoyu@Admin:~$ type -a ps
4 ps is /bin/ps
5 xiaoyu@Admin:~$ ls -lF /bin/ps
6 -rwxr-xr-x 1 root root 97408 5月 14 2018 /bin/ps*
7 xiaoyu@Admin:~$
當外部命令執行時,會創建出一個子進程。這種操作被稱為衍生(forking)。外部命令ps很方便顯示出它的父進程以及自己 所對應的衍生子進程。
1 xiaoyu@Admin:~$ ps -f 2 UID PID PPID C STIME TTY TIME CMD 3 xiaoyu 2906 2899 0 10:23 pts/6 00:00:00 bash 4 xiaoyu 50292 2906 0 14:30 pts/6 00:00:00 ps -f 5 xiaoyu@Admin:~$
作為外部命令,ps命令執行時會創建出一個子進程。在這里,ps命令的PID是50292。PPID是2906。作為父進程的bash shell的PID是2906。下圖展示了外部命令執行時的衍生過程。
當進程必須執行衍生操作時,它需要花費時間和精力來設置新子進程的環境。所以說,外部命令多少還是由代價的。
說明:就算衍生出子進程或是創建了子shell,你仍然可以通過發送信號與其溝通,這一點無論是在命令行還是在腳本編寫中都是極其有用的。發送信號(signaling)使得進程間可以通過信號進行通信。
內建命令
內建命令和外部命令的區別在於前者不需要使用子進程來執行。它們已經和shell編譯成了一體,作為shell工具的組成部分存在。不需要借助外部程序文件來運行。
cd和exit命令都內建於bash shell。可以利用type命令來了解某個命令是否是內建的。
1 xiaoyu@Admin:~$ type cd 2 cd is a shell builtin 3 xiaoyu@Admin:~$ type exit 4 exit is a shell builtin 5 xiaoyu@Admin:~$
因為即不需要通過衍生出子進程來執行,也不需要打開程序文件,內建命令的執行速度要更快,效率也更高。
需要注意的是:有些命令有多種實現。例如echo和pwd既有內建命令也有外部命令。兩種實現略有不同。要查看命令的不同實現,使用type命令的-a選項。
1 xiaoyu@Admin:~$ type -a echo
2 echo is a shell builtin 3 echo is /bin/echo
4 xiaoyu@Admin:~$ which echo
5 /bin/echo
6 xiaoyu@Admin:~$ type -a pwd
7 pwd is a shell builtin 8 pwd is /bin/pwd
9 xiaoyu@Admin:~$ which echo
10 /bin/echo
11 xiaoyu@Admin:~$
命令type -a會顯示出每個命令的兩種實現。注意:which命令只顯示出了外部命令文件。
對於有多種實現的命令,如果想要使用其外部命令實現,直接指明對應的文件就可以了。例如,要使用外部命令pwd,可以輸入/bin/pwd。
1、使用history命令
1 xiaoyu@Admin:~$ history 2 1 cd Downloads/
3 2 ls -l 4 3 tar zxvf VMwareTools-10.3.10-12406962.tar.gz 5 4 ls -l 6 5 cd vmware-tools-distrib/
7 6 ls
8 7 sudo ./vmware-install.pl 9 8 sudo apt-get install open-vm-tools 10 9 sudo apt-get install open-vm*
11 10 sudo reboot 12 11 cd /mnt/hgfs/
13 12 ls
14 13 cd share/
15 14 ls
16 15 ps -forest
這里我就只列出這么多,通常歷史記錄中會保存最近的1000條命令。這個數量一點都不少。
可以設置保存在bash歷史記錄中的命令數。要想實現這一點,需要修改名為HISTSIZE的環境變量。
可以喚回並重用歷史列表中最近的命令。這樣能夠節省時間和擊鍵量。輸入!!,然后按回車鍵就能夠喚出剛剛用過的那條命令來使用
1 xiaoyu@Admin:~$ ps --forest 2 PID TTY TIME CMD 3 2906 pts/6 00:00:00 bash 4 52030 pts/6 00:00:00 \_ ps
5 xiaoyu@Admin:~$ !!
6 ps --forest 7 PID TTY TIME CMD 8 2906 pts/6 00:00:00 bash 9 52033 pts/6 00:00:00 \_ ps
10 xiaoyu@Admin:~$
當輸入!!時,bash首先會顯示出從shell的歷史紀錄中喚回的命令。然后執行該命令。
命令歷史記錄被保存在隱藏文件.bash_history中,它位於用戶的主目錄中。這里要注意的是,bash命令的歷史紀錄是先存放在內存中,當shell退出時才被寫入到歷史文件中。
可以在退出shell會話之前強制將命令歷史記錄寫入.bash_history文件。要實現強制寫入,需要使用history命令的-a選項。
說明 如果你打開了多個終端會話,仍然可以使用history -a命令在打開的會話中向.bash_history文件中添加記錄。但是對於其他打開的終端會話,歷史記錄並不會自動更新。這是因為.bash_history文件只有在打開首個終端會話時才會被讀取。要想強制重新讀取.bash_history文件,更新終端會話的歷史記錄,可以使用history -n命令。
可以喚回歷史列表中任意一條命令。只需輸入驚嘆號和命令在歷史列表中的編號即可。
1 $ !20
2 type -a pwd
3 pwd is a shell builtin 4 pwd is /bin/pwd
5 $
2、命令別名
alias命令是另一個shell的內建命令。命令別名允許你為常用的命令(及其參數)創建另一個名稱,從而將輸入量減少到最低。
你所使用的Linux發行版很有可能已經為你設置好了一些常用命令的別名。要查看當前可用的別名,使用alias命令以及選項-p。
1 xiaoyu@ubuntu:~$ alias -p 2 alias alert='notify-send --urgency=low -i "$([ $? = 0 ] && echo terminal || echo error)" "$(history|tail -n1|sed -e '\''s/^\s*[0-9]\+\s*//;s/[;&|]\s*alert$//'\'')"'
3 alias egrep='egrep --color=auto'
4 alias fgrep='fgrep --color=auto'
5 alias grep='grep --color=auto'
6 alias l='ls -CF'
7 alias la='ls -A'
8 alias ll='ls -alF'
9 alias ls='ls --color=auto'
10 xiaoyu@ubuntu:~$
可以使用alias命令創建屬於自己的別名
1 xiaoyu@ubuntu:~$ alias li='ls -i'
2 xiaoyu@ubuntu:~$ li 3 2752525 Desktop 2752526 Downloads 2752530 Music 2752531 Pictures 2752527 Templates 2752982 vmware-tools-distrib 4 2752529 Documents 2752517 examples.desktop 2755056 new_my_directory 2752528 Public 2752532 Videos 2752953 xiaoyu 5 xiaoyu@ubuntu:~$ bash 6 xiaoyu@ubuntu:~$ li 7 li: command not found 8 xiaoyu@ubuntu:~$ exit 9 exit 10 xiaoyu@ubuntu:~$ li 11 2752525 Desktop 2752526 Downloads 2752530 Music 2752531 Pictures 2752527 Templates 2752982 vmware-tools-distrib 12 2752529 Documents 2752517 examples.desktop 2755056 new_my_directory 2752528 Public 2752532 Videos 2752953 xiaoyu 13 xiaoyu@ubuntu:~$
在定義好別名之后,隨時都可以在shell中使用,就算再shell腳本中也沒問題。要注意:因為命令別名屬於內建命令,一個別名盡在它所被定義的shell進程中才有效。上例子中就是很好的說明。