聊一聊腳本執(zhí)行方式,你學會了嗎?
本文轉載自微信公眾號「Linux常用命令」,作者妖生。轉載本文請聯(lián)系Linux常用命令公眾號。
Shell腳本的后綴一般為“.sh”,腳本第一行一般都是指向執(zhí)行Shell,例如“#!/bin/bash”。【#!】指定解釋腳本執(zhí)行的Shell。
執(zhí)行Shell腳本有多種方式,我們可以直接使用【sh xx.sh】或者【bash xx.sh】來執(zhí)行Shell,也可以使用【./xx.sh】、【/shell/xx.sh】,或者【source .sh】、【. xx.sh】。
它們有什么區(qū)別呢?測試腳本如下:
- [root@yaomm shell]# cat testShell.sh ## 查看演示Shell腳本
- #!/bin/bash
- cd /opt ; # 切換到/opt目錄去
- pwds=`pwd`; # 查看當前路徑
- pids=$$; # 查看當前進程
- users=`whoami`; # 查看當前用戶
- echo "當前路徑: ${pwds},當前進程PID:${pids},當前用戶: ${users}"
sh方式執(zhí)行(也可以使用bash):
- [root@yaomm shell]# echo $$ ## 查看當前cli(命令行)界面的進程號
- 22524 ## 每次登錄Shell時打開的Shell界面進程號
- [root@yaomm shell]# sh testShell.sh ## 使用bash執(zhí)行
- 當前路徑: /opt,當前進程PID:10836,當前用戶: root ## 輸出當前切換路徑、進程號、用戶名
- [root@yaomm shell]# echo $users ## 子Shell中變量打印為空
相對路徑方式執(zhí)行(也可以使用絕對路徑):
- [root@yaomm shell]# ./testShell.sh ## 使用路徑執(zhí)行,沒有權限
- -bash: ./testShell.sh: Permission denied ## 沒有執(zhí)行權限
- [root@yaomm shell]# chmod +x testShell.sh ## 賦予執(zhí)行權限
- [root@yaomm shell]# ./testShell.sh ## 使用路徑執(zhí)行
- 當前路徑: /opt,當前進程PID:10873,當前用戶: root ## 與bash執(zhí)行的結果類似
- [root@yaomm shell]# echo $users ## 子Shell中變量打印為空
source方式執(zhí)行(也可以使用點.):
- [root@yaomm shell]# source testShell.sh ## 使用source執(zhí)行
- 當前路徑: /opt,當前進程PID:22524,當前用戶: root ## 進程號
- [root@yaomm opt]# ## 看到當前目錄已經被切換到/opt下了
- [root@yaomm opt]# echo $users ## source執(zhí)行,子Shell中變量被賦值
- root ## $users成為全局環(huán)境變量,不過重新登陸Shell后還是會消失
sh、source不需要執(zhí)行權限就可以運行Shell腳本,為什么?因為Shell腳本只是作為一個參數(shù)傳遞到sh、bash、source命令中,使用的是bash這些腳本的權限。而路徑執(zhí)行,則使用的是被執(zhí)行腳本文件本身的權限,所以需要賦權x。
sh與source執(zhí)行也是有區(qū)別的,sh執(zhí)行腳本會打開(fork)一個子進程(也叫子Shell、Sub Shell),Shell腳本內的環(huán)境變化不會影響到當前Shell進程(父進程、父Shell)。
source不創(chuàng)建Sub Shell,在當前Shell環(huán)境下讀取并執(zhí)行腳本文件中的命令,相當于順序讀取并執(zhí)行“.sh”文件里面的命令。
還有其他執(zhí)行腳本的方式,不常用,不再贅述。
最后,用一張表來總結下,Shell執(zhí)行的幾種方式和區(qū)別。
執(zhí)行命令 | 示例 | 權限 | 打開子進程 | 說明 |
---|---|---|---|---|
sh、bash | bash test.sh、h test.sh | 不需要 | 是 | sh、bash都是使用/usr/bin/bash |
./、/ | ./test.sh、/shell/test.sh | 需要 | 是 | 相對路徑、絕對路徑執(zhí)行,需要有腳本文件的執(zhí)行權限 |
.、source | . test.sh 、source test.sh | 不需要 | 否 | 點+空格等同source,source執(zhí)行腳本相當于把腳本中語句逐行讀取并在命令行界面執(zhí)行 |
<、| | sh>test.sh、cat tst.sh | bash | 不需要 | 是 | 對有參數(shù)的腳本不支持 |
exec | exec ./test.sh | 需要 | 否 | 替換當前進程資源,不要在命令行界面執(zhí)行,否則登錄Shell界面會被直接關閉 |