Linux執行 腳本 有兩種方式,每種方式又有具體不同的執行方法, 主要區別在於是否建立 “子shell 也叫 subshell”。
方式1: source filename 或者 . filename (點 空格 filename)
不創建 子shell,在當前 bash 環境下讀取filename中的命令,並執行。
關於 source . 方法: 如果filename不在當前路徑下,或者filename不在執行程序默認的搜索路徑下(也就是PATH環境變量), bash可能會提示找不到 filename。
方式2: bash filename 或者 sh filename 或者 ./filename (點 斜杠 filename) 或者 /path1/path2/filename (斜杠 加上 絕對路徑)
創建 子shell, 在當前 bash 環境下 創建一個新的 子shell 來讀取filename中的命令,並執行。filename腳本執行完后,子shell 環境隨即關閉,然后又回到 父shell 中。
關於 bash sh ./ 方法: 如果filename不在當前路徑下,或者filename不在執行程序默認的搜索路徑下(也就是PATH環境變量), bash可能會提示找不到 filename。
關於 bash 和 sh 方法:filename可以不必事先設定可執行權限。 因為是將filename作為參數傳遞給bash或者sh,是被調用執行。
關於 ./ 方法: filename必須具備可執行權限,它才可以自己執行。
額外:子shell 繼承 父shell 的變量, 子shell 通過 export 來使用 父shell 的變量。 (跟編程中的作用於有點兒相似)
子shell 從 父shell 繼承如下內容:
當前工作目錄;
環境變量;
標准輸入、標准輸出、標准錯誤輸出;
所有已打開的文件標識符;
忽略的信號;
子shell 不能從 父shell 繼承的內容如下:
除環境變量和 .bashrc文件定義的變量之外的shell變量;
未被忽略的信號;
下面編寫一個腳本(a1.sh) 來玩一下這幾種情況:
更多的有關 子shell 繼承 父shell 內容,在 子shell 中使用 從 父shell 里繼承的內容。 以后有使用案例了,在貼上具體的操作過程。