在Linux中,source
和bash
(或sh
)都是用于執行Shell腳本的命令,但它們在執行方式和作用域上有顯著區別:
1. 執行方式
-
bash script.sh
(或sh script.sh
)- 啟動一個新的子Shell進程來執行腳本。
- 腳本中的變量、函數、別名等僅在子Shell中生效,父Shell環境不會受到影響。
- 腳本執行完畢后,子Shell退出,所有修改隨之消失。
-
source script.sh
(或. script.sh
)- 直接在當前Shell環境中執行腳本,不創建子Shell。
- 腳本中對環境變量、路徑、函數等的修改會直接影響當前Shell會話。
- 常用于加載配置文件(如
~/.bashrc
)或更新當前環境。
2. 作用域對比
場景 | bash script.sh | source script.sh |
---|---|---|
變量定義 | 僅在子Shell中有效 | 當前Shell中生效 |
修改PATH 等環境變量 | 不影響當前Shell | 直接影響當前Shell |
執行后退出 | 子Shell終止,修改丟失 | 修改持久保留 |
3. 典型用途
-
bash
適合運行獨立腳本,無需影響當前環境(例如工具腳本、測試任務)。 -
source
需要修改當前Shell狀態時使用,例如:source ~/.bashrc # 重新加載配置 source venv/bin/activate # 激活Python虛擬環境
4. 其他區別
- 權限要求
bash script.sh
需要腳本有可執行權限(或通過解釋器顯式調用),而source
不需要。 - 調試
bash -x script.sh
可以調試腳本,而source
的調試需結合set -x
。
示例驗證
假設腳本test.sh
內容:
#!/bin/bash
export VAR="hello"
- 執行
bash test.sh
后,echo $VAR
輸出為空(變量未保留)。 - 執行
source test.sh
后,echo $VAR
輸出hello
(變量已生效)。