運行shell腳本的三種方式


先來看一個簡單的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腳本的話並不創建子進程,就是在原來的進程中執行,所以最后的工作目錄改變了。

 

 

  關於解釋型語言和編譯型語言

  相對於編譯型語言存在的,源代碼不是直接翻譯成機器語言,而是先翻譯成中間代碼,再由解釋器對中間代碼進行解釋運行。比如Python/JavaScript / Perl /Shell等都是解釋型語言。
解釋型語言:程序不需要 編譯,程序在運行時才翻譯成 機器語言,每執 行一次都要翻譯一次。因此效率比較低。比如Basic語言,專門有一個解釋器能夠直接執行Basic程 序,每個語句都是執行的時候才翻譯。(在運行程序的時候才翻譯,專門有一個解釋器去進行翻譯,每個語句都是執行的時候才翻譯。效率比較低,依賴解釋器,跨 平台性好.)

 


免責聲明!

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



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