shell腳本中的source
❶ shell腳本執行source報錯
在Ubuntu 16.04機器在執行shell腳本時,報source: not found
原因是shell腳本執培困行的時候配稿念用的不是bash,而是dash,可以使用下面方法修改。
出現對話框後,選擇no,再查看一次
重新執行腳本敬塌,問題解決
❷ shell命令中用source 和sh(或者bash)執行腳本的區別,以及export的作用
用戶登錄到linux系統後,系統將啟動一個用戶shell,我們暫且稱這個shell為shell父。在這個shell父中,可以使用shell命令或聲明變數,也可以創建並運行shell腳本程序。
當使用sh或者bash運行shell腳本程序時,系統將創建一個子shell,我們暫且稱為shell子。此時,系統中將有兩個shell,一個是登錄時系統啟動的shell父,另一個是系統為運行腳本程序創建的shell子。
當一個腳本程序運行完畢,腳本shell子將終止,返回到執行該腳本之前的shell父。這時腳本中創建的變數或者環境變數(export的變數)是在shell子中創建的,只在shell子中有效,在shell父中是無法訪問的source(或者.)的作用是文件包含,當使用source運行腳本程序時,系統並不會創建子shell,而是將腳本中的命令放到shell父中運行,這時腳本中創建的變數或者環境變數(export的變數)相當於是在shell父中創建的,在shell父中是可以訪問的。
因此使用source執行修改後的配置文件會直接生效,不需要重啟export 的作用是為當前shell設置環境變數,這樣變數在其子shell也可以訪問,當然,在其父shell中還是無法訪問的普通的變數只在當前shell中可以訪問,在父shell或者子shell中都無法訪問。
export 也是 bash 的一個內置命令。它主要是用來將父 shell 里的變數導出供子 shell 使用。
它有如下特徵:
❸ exec、source以及bash的區別
在bash shell中,source、exec以及sh都可以用來執行shell script,但是它們的差別在哪裡呢?sh:父進程會fork一個子進程,shell script在子進程中執行source:在原進程中執行,不會fork子進程exec:在原進程中執行,但是同時會終止原進程 註:使用export會把父進程中的變數向子進程中繼承,但是反過來卻不行,在子進程中,不管環境如果改變,均不會影響父進程
下面用一個例子來講解
[plain] view plain
1.sh
A=B
echo "PID for 1.sh before exec/source/fork:$"
export A
echo "1.sh: $A is $A"
case $1 in
exec)
echo "using exec..."
exec ./2.sh ;;
source)
echo "using source..."
. ./2.sh ;;
*)
echo "using fork by default..."
./2.sh ;;
esac
echo "PID for 1.sh after exec/source/fork:$"
echo "1.sh: $A is $A"
[plain] view plain
2.sh
CODE:
echo "PID for 2.sh: $"
echo "2.sh get $A=$A from 1.sh"
A=C
export A
echo "2.sh: $A is $A"
下面在命令行中去執行
./1.sh fork
可以看到,1.sh是在父進程中執行,2.sh是在子進程中執行的,父進程的PID是5344,而子進程的是5345,當子進程執行完畢後,控制權返回到父進程。同時,在子進程改變環境變數A的值不會影響到父進程。
./1.sh source
由結果可知,1.sh和2.sh都是在同一進程中執行的,PID為5367
./1.sh exec
可知,兩個腳本都是在同一進程中執行,但是請注意,使用exec終止了原來的父進程,因此,可以看到
[plain] view plain
echo "PID for 1.sh after exec/source/fork:$"
echo "1.sh: $A is $A"
這兩個命令沒有執行
由這個例子,便大致可了解它們的區別了
❹ linux下的Source命令的基本功能
source命令用法:source FileName
作用:在當前bash環境下讀取並執行FileName中的命令。
註:該命令通常用命令".」來替代。
使用範例:
1、source filename
2、. filename#(中間有空格)
source命令(從 C Shell 而來)是bash shell的內置命令。點命令,就是個點符號,(從Bourne Shell而來)是source的另一名稱。
同樣的,當前腳本中配置的變數也將作為腳本的環境,source(或點)命令通常用於重新執行剛修改的初始化文檔,如 .bash_profile 和 .profile 等等。
例如,假如在登錄後對 .bash_profile 中的 EDITER 和 TERM 變數做了修改,則能夠用source命令重新執行 .bash_profile 中的命令而不用注銷並重新登錄。
比如在一個腳本里export $KKK=111,假如用./a.sh執行該腳本,執行完畢後,運行echo $KKK,發現沒有值,假如用source來執行 ,然後再echo,就會發現KKK=111。
因為調用./a.sh來執行shell是在一個子shell里運行的,所以執行後,結構並沒有反應到父shell里,但是source不同他就是在本shell中執行的,所以能夠看到結果。
source命令(從 C Shell 而來)是bash shell的內置命令。點命令,就是一個點符號,(從Bourne Shell而來)是source的另一名稱。
這兩個命令都以一個腳本為參數,該腳本將作為當前shell的環境執行,即不會啟動一個新的子進程。所有在腳本中設置的變數將成為當前Shell的一部分。
文件建立好之後,以後每次編譯核心,只需要在/usr/src/linux-2.4.20下輸入source make_command就行了。這個文件也完全可以做成腳本,只需稍加改動即可。
shell編程中的命令有時和C語言是一樣的。&&表示與,||表示或。把兩個命令用&&聯接起來,如make mrproper && make menuconfig,表示要第一個命令執行成功才能執行第二個命令。
對執行順序有要求的命令能保證一旦有錯誤發生,下面的命令不會盲目地繼續執行。
❺ shell中source和sh script的區別
主要區別,source是在當前的shell下運行文件內容,而sh或bash或其他shell+腳本文件,是在新的shell中執行。
可以在腳本文件中只寫上變數賦值,如a=12,來進行驗證:
在最初,echo $a 是空值或其他值,運行sh 腳本名 之後,再echo一下,a的值沒有變,
而使用source 腳本名之後,echo $a 則顯示12,它的值變化了。
source一般用於執行一些配置文件,比如.bashrc等,比如默認可能沒有ll命令,在.bashrc中可以設置alias ll='ls -alF',source運行一下,就不用退出當前shell重新打開 就可以使用ll命令了。
❻ 執行shell腳本三種方法的區別:(sh、exec、source)
使用$ sh script.sh執行腳本時,當前shell是父進程,生成一個子shell進程,在子shell中執行腳本。腳本執行完畢,退出子shell,回到當前shell。
./script.sh與 sh script.sh等效。
使用$ source script.sh方式,在當前上下文中執行腳本,不會生成新的進程。腳本執行完畢,回到當前shell。
source方式也叫點命令。
. script.sh與 source script.sh等效。
使用exec command方式,會用command進程替換當前shell進程,並且保持PID不變。執行完畢,直接退出,不回到之前的shell環境。
二、測試驗證
vi loop.sh
顯示當前進程
sh的方式:執行loop.sh列印執行進程
source方式:執行loop.sh列印執行進程
exec方式:執行loop.sh列印執行進程
按下ctrl+C
sh方式:父進程是6770,執行loop.sh時的子進程是13736。執行完畢後回到父進程shell。
source方式:父進程和子進程都是6770(執行時沒有新的進程),執行完畢會回到父進程shell。
exec方式:進程PID沒有改變都是6770,執行完畢(ctrl+C強制關閉)時直接退出了shell。腳本執行時替換了父進程的shell,執行完畢後直接退出,沒有回到之前的shell。