Linux Shell的父子關系及內建命令


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進程中才有效。上例子中就是很好的說明。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM