Shell的作用是解釋執(zhí)行用戶的命令,用戶輸入一條命令,Shell就解釋執(zhí)行一條,這種方式稱為交互式(Interactive),Shell還有一種執(zhí)行命令的方式稱為批處理(Batch,類似與windows 下的批處理.bat 文件),用戶事先寫一個Shell腳本(Script),其中有很多條命令,讓Shell一次把這些命令執(zhí)行完,而不必一條一條地敲命令。Shell腳本和編程語言很相似,也有變量和流程控制語句,但Shell腳本是解釋執(zhí)行的,不需要編譯,Shell程序從腳本中一行一行讀取并執(zhí)行這些命令,相當于一個用戶把腳本中的命令一行一行敲到Shell提示符下執(zhí)行。
常見的 Shell 有 sh、bash、csh、tcsh、ash 等。
shell 是一個程序,一般都是放在/bin 或者/user/bin目錄下,當前l(fā)inux 系統(tǒng)可用的shell 都記錄在/etc/shells文件中。如果你希望查看當前 Linux 的默認 Shell,那么可以輸出 SHELL 環(huán)境變量:
echo $SHELL
vim /etc/passwd
其中最后一列顯示了用戶對應的shell類型
root:x:0:0:root:/root:/bin/bash
saned:x:119:127::/var/lib/saned:/bin/false
usbmux:x:120:46:usbmux daemon,,,:/var/lib/usbmux:/bin/false
zhang:x:1000:1000:zhang,,,:/home/zhang:/bin/bash
mysql:x:1001:1001::/home/mysql:/sbin/nologin
www:x:1002:1002::/home/www:/sbin/nologin
referee:x:1003:1003::/home/referee:/bin/sh
用戶在命令行輸入命令后,一般情況下Shell會fork并exec該命令,但是Shell的內(nèi)建命令例外,執(zhí)行內(nèi)建命令相當于調(diào)用Shell進程中的一個函數(shù),并不創(chuàng)建新的進程。以c常用的cd、alias、umask、exit等命令即是內(nèi)建命令,凡是用which命令查不到程序文件所在位置的命令都是內(nèi)建命令,內(nèi)建命令沒有單獨的man手冊,要在man手冊中查看內(nèi)建命令,應該執(zhí)行
man bash-builtins
或者
man builtins
shell 運行方式
當 shell 腳本以非交互的方式運行時,它會先查找環(huán)境變量ENV,該變量指定了一個環(huán)境文件(通常是. bashrc),然后從該環(huán)境變量文件開始執(zhí)行,當讀取了ENV文件后,SHELL才開始執(zhí)行 shell 腳本中的內(nèi)容。 shell腳本的執(zhí)行通??梢圆捎靡韵氯N方式:
bash script-name或 sh script-name(推薦使用) path/ script-name或 ./script-name(當前路徑下執(zhí)行腳本) source script-name或. script-name#一注意“.”點號和script-name 之間有空格。
執(zhí)行說明:
第一種方法是當腳本文件本身沒有可執(zhí)行權(quán)限(即文件x位為-號)時常使用的方法,這里推薦用bash執(zhí)行,或者文件開頭沒有指定解釋器。
第二種方法需要先將腳本文件的權(quán)限改為可執(zhí)行(即文件加x位),具體方法: chmod u+x script-name或 chmod755 script-name,然后通過腳本路徑就可以直接執(zhí)行腳本了。
第三種方法通常是使用source 或者 “.”號讀入或加載指定的shell 腳本文件(son.sh),然后,依次執(zhí)行該指定shell 腳本文件son.sh 中的所有的語句。這些語句將作為當前父shell 腳本father.sh 進程的一部分運行。因此,使用source 或者”.” 號可以將子shell(son.sh) 自身腳本中的變量的值或者函數(shù)等的返回值傳遞到當前父shell 腳本(father.sh) 中使用。這是第三種方法和前兩種方法的最大區(qū)別,在linux 中很多配置文件修改后就是直接source 執(zhí)行的。
source 或者 “.” 點號命令的功能是在當前shell 中執(zhí)行source 或者”.” 點號加載并執(zhí)行的相關(guān)腳本文件中的命令及語句,而不是產(chǎn)生一個子shell 來執(zhí)行命令文件中的命令。
zhang@zhang:~/Code/Shell$ cat exec_method.sh #! /bin/bash echo "set varriable begin...." current_dir=`pwd` echo "set varriable end..." echo "current dir is : "$current_dir zhang@zhang:~/Code/Shell$ /bin/bash exec_method.sh set varriable begin.... set varriable end... current dir is : /home/zhang/Code/Shell zhang@zhang:~/Code/Shell$ echo $current_dir zhang@zhang:~/Code/Shell$ chmod u+x exec_method.sh zhang@zhang:~/Code/Shell$ ./exec_method.sh set varriable begin.... set varriable end... current dir is : /home/zhang/Code/Shell zhang@zhang:~/Code/Shell$ echo $current_dir zhang@zhang:~/Code/Shell$ . exec_method.sh set varriable begin.... set varriable end... current dir is : /home/zhang/Code/Shell zhang@zhang:~/Code/Shell$ echo $current_dir /home/zhang/Code/Shell zhang@zhang:~/Code/Shell$
由上面執(zhí)行結(jié)果可以看出,. 或 source 方式執(zhí)行腳本與前面兩種執(zhí)行方式的不同點–以這種方式執(zhí)行的腳本中聲明的變量, 都可以在當前shell 中得以繼續(xù)使用,使用.(點號)方式的時候一定要注意,點號和執(zhí)行腳本之間的空格。