exec 是 bash 的內(nèi)置命令
shell 的內(nèi)件命令exec執(zhí)行命令時,不啟用新的shell進(jìn)程橙垢。
source 和 .?不啟用新的shell垛叨,在當(dāng)前shell中執(zhí)行,設(shè)定的局部變量在執(zhí)行完命令后仍然有效柜某。
bash 或 sh 或 shell script 執(zhí)行時嗽元,另起一個子shell,其繼承父shell的環(huán)境變量喂击,其子shelll的變量執(zhí)行完后不影響父shell剂癌。
exec是用被執(zhí)行的命令行替換掉當(dāng)前的shell進(jìn)程,且exec命令后的其他命令將不再執(zhí)行翰绊。
例如在當(dāng)前shell中執(zhí)行 exec ls ?表示執(zhí)行l(wèi)s這條命令來替換當(dāng)前的shell 佩谷,即為執(zhí)行完后會退出當(dāng)前shell旁壮。
為了避免這個結(jié)果的影響,一般將exec命令放到一個shell腳本中谐檀,用主腳本調(diào)用這個腳本抡谐,調(diào)用處可以用bash? xx.sh(xx.sh為存放exec命令的腳本),這樣會為xx.sh建立一個子shell去執(zhí)行稚补,當(dāng)執(zhí)行exec后該子腳本進(jìn)程就被替換成相應(yīng)的exec的命令。
其中有一個例外:當(dāng)exec命令對文件描述符操作的時候框喳,就不會替換shell课幕,而是操作完成后還會繼續(xù)執(zhí)行后面的命令!
在shell腳本中使用exec命令五垮,根據(jù)操作的對象不同會有不同的行為
文件描述符
shell中描述符一共有12個
0 ?代表標(biāo)準(zhǔn)輸入
1 ?代表標(biāo)準(zhǔn)輸出
2 ?錯誤輸出
其他 3-9 都是空白描述符
# ?exec3>&1?4>&2?1>>?bash.log?2>&1
其含義是: 復(fù)制標(biāo)準(zhǔn)輸出到3 乍惊,錯誤輸出到 4 ,把 3 4 保存在bash.log 這個文件中放仗。
# ?./bash.sh ?>> bash.log ? 2>&1
其含義是:將bash.sh腳本執(zhí)行的標(biāo)準(zhǔn)輸出和錯誤輸出追加重定向到 bash.log
如果exec 跟的是其他命令润绎,則其他命令結(jié)束后,本shell也隨之停止
# ?cat test_exec.sh
###################
#!/bin/bash ?
#?
echo "Hello mysql" ?
exec echo "Hello oracle" ?
echo "Hello sqlserver"
####################
可以看到隨著 echo " hello oracle" ?這條指令運行完本 整個腳本執(zhí)行完畢诞挨,后面的 echo " hello db2" 沒有執(zhí)行莉撇!
Linux shell 腳本中, $@ 和$# 分別是什么意思惶傻?
$@ ?表示所有腳本參數(shù)的內(nèi)容
$# 表示返回所有腳本參數(shù)的個數(shù)
示例:編寫如下shell腳本棍郎,保存為test.sh
###############
#!/bin/sh
echo "number:$#"
echo "argume:$@"
###############
執(zhí)行腳本:
./test.sh?first_arg ?second_arg
說明:給腳本提供了兩個參數(shù),所以$#輸出的結(jié)果是2银室,$@代表了參數(shù)的內(nèi)容涂佃!
怎么理解shell腳本中 ?exec?"`dirname "$0"`/node""$0" ?"$@" ?
$0 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? # 腳本自己的路徑
"`dirname "$0"`"/node ? ?# 腳本目錄下的node程序的路徑
$@ ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?# 腳本被執(zhí)行時的命令行參數(shù)
合起來就是:用腳本目錄下的node程序來解釋這個腳本本身
exec scala "$0" "$@"是什么意思
這是bash語法蜈敢。
$0 ?表示當(dāng)前腳本的名字
$@ ?表示當(dāng)前腳本執(zhí)行的所有參數(shù)
exec scala "$0" "$@" ? ?表示用scala命令辜荠,帶參數(shù),執(zhí)行當(dāng)前腳本
exec ?sh "$0 ?在這個文件里抓狭,exec sh ?$0是什么意思伯病?
############
#!/bin/sh
echo ?"Hello!"
sleep 2
execsh?"$0"
#############
$0 ? 是位置參數(shù),表示腳本名稱
$1 ? 表示腳本的第一個參數(shù)否过,依次類推直到$9
exec用于執(zhí)行命令狱从、或腳本、或外部可執(zhí)行程序叠纹,會新建一個shell去執(zhí)行
綜上季研,這里exec sh ?"$0" ?就是執(zhí)行腳本本身
所以,就是一個循環(huán)過程,每隔兩秒打印一次 Hello
#############
#!/bin/sh
echo ?"Hello!"
sleep 2
exec ??"$0"
#############