先來看一個簡單的shell腳本:
#!/bin/sh cd /tmp echo "hello,world!"
我們來挨個解釋一下腳本的每一行:
第一行:#!后面跟的是解釋器的路徑(shell本身就是一種解釋型語言),解釋器的路徑是/bin/sh;
第二行:cd命令是切換當前工作目錄的命令,tep是linux下根目錄的一個子目錄;
第三行:echo命令是輸出后面所跟的參數
三種執行方法:
第一種:因為shell程序寫完之后並沒有執行權限,所以該腳本想要執行可以使用chmod命令賦予該腳本可執行的權限,然后再執行。
[root@localhost shell]# chmod +x echo.sh [root@localhost shell]# ./echo,sh bash: ./echo,sh: 沒有那個文件或目錄 [root@localhost shell]# ./echo.sh hello,world! [root@localhost shell]# pwd /root/shell [root@localhost shell]#
第二種:調用解釋器使得腳本執行,例如:bash、csh、csh、ash、bsh、ksh等等;
[root@localhost shell]# sh echo.sh hello,world! [root@localhost shell]# bash echo.sh hello,world!
[root@localhost shell]# pwd
/root/shell
第三種:使用source命令;
root@localhost shell]# source echo.sh hello,world! [root@localhost tmp]# pdw bash: pdw: command not found [root@localhost tmp]# pwd /tmp
細心的讀者可能發現了一個問題:在腳本的第一行有cd命令,這是一個改變工作目錄的命令,可是使用第一種和第二種放大執行腳本后當前的工作目錄並沒有改變(腳本所在的目錄是shell文件夾,腳本執行后,使用pwd命令顯示出當前的工作目錄還是shell),使用第三種方法執行后當前的工作目錄就改變了,進入了tmp中。出現這種情況是系統本身執行腳本的方式不同所造成的!
前兩種方法執行腳本時系統會創建一個子進程或者說子shell來執行腳本,原來的進程就是父進程或者說父shell,整個過程中父進程會等待子進程執行完畢,然后子進程退出,父進程也退出。cd命令確實被執行了,但是僅僅是在子進程中改變了工作目錄,所以腳本執行完后使用pwd顯示工作目錄並沒有改變。而第三種方法執行的shell腳本的話並不創建子進程,就是在原來的進程中執行,所以最后的工作目錄改變了。
關於解釋型語言和編譯型語言
