【exec】shell腳本中的 exec 命令

exec 是 bash 的內(nèi)置命令

shell 的內(nèi)件命令exec執(zhí)行命令時(shí),不啟用新的shell進(jìn)程。

source 和 .?不啟用新的shell,在當(dāng)前shell中執(zhí)行,設(shè)定的局部變量在執(zhí)行完命令后仍然有效。

bash 或 sh 或 shell script 執(zhí)行時(shí),另起一個(gè)子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í)行完后會(huì)退出當(dāng)前shell。

為了避免這個(gè)結(jié)果的影響,一般將exec命令放到一個(gè)shell腳本中,用主腳本調(diào)用這個(gè)腳本,調(diào)用處可以用bash? xx.sh(xx.sh為存放exec命令的腳本),這樣會(huì)為xx.sh建立一個(gè)子shell去執(zhí)行,當(dāng)執(zhí)行exec后該子腳本進(jìn)程就被替換成相應(yīng)的exec的命令。

其中有一個(gè)例外:當(dāng)exec命令對(duì)文件描述符操作的時(shí)候,就不會(huì)替換shell,而是操作完成后還會(huì)繼續(xù)執(zhí)行后面的命令!


在shell腳本中使用exec命令,根據(jù)操作的對(duì)象不同會(huì)有不同的行為

文件描述符

shell中描述符一共有12個(gè)

0 ?代表標(biāo)準(zhǔn)輸入

1 ?代表標(biāo)準(zhǔn)輸出

2 ?錯(cuò)誤輸出

其他 3-9 都是空白描述符

# ?exec3>&1?4>&2?1>>?bash.log?2>&1

其含義是: 復(fù)制標(biāo)準(zhǔn)輸出到3 ,錯(cuò)誤輸出到 4 ,把 3 4 保存在bash.log 這個(gè)文件中。

# ?./bash.sh ?>> bash.log ? 2>&1

其含義是:將bash.sh腳本執(zhí)行的標(biāo)準(zhǔn)輸出和錯(cuò)誤輸出追加重定向到 bash.log

如果exec 跟的是其他命令,則其他命令結(jié)束后,本shell也隨之停止

# ?cat test_exec.sh

###################

#!/bin/bash ?

#?

echo "Hello mysql" ?

exec echo "Hello oracle" ?

echo "Hello sqlserver"

####################

可以看到隨著 echo " hello oracle" ?這條指令運(yùn)行完本 整個(gè)腳本執(zhí)行完畢,后面的 echo " hello db2" 沒有執(zhí)行!

Linux shell 腳本中, $@ 和$# 分別是什么意思?

$@ ?表示所有腳本參數(shù)的內(nèi)容

$# 表示返回所有腳本參數(shù)的個(gè)數(shù)

示例:編寫如下shell腳本,保存為test.sh

###############

#!/bin/sh

echo "number:$#"

echo "argume:$@"

###############

執(zhí)行腳本:

./test.sh?first_arg ?second_arg

說明:給腳本提供了兩個(gè)參數(shù),所以$#輸出的結(jié)果是2,$@代表了參數(shù)的內(nèi)容!

怎么理解shell腳本中 ?exec?"`dirname "$0"`/node""$0" ?"$@" ?

$0 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? # 腳本自己的路徑

"`dirname "$0"`"/node ? ?# 腳本目錄下的node程序的路徑

$@ ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?# 腳本被執(zhí)行時(shí)的命令行參數(shù)

合起來就是:用腳本目錄下的node程序來解釋這個(gè)腳本本身

exec scala "$0" "$@"是什么意思

這是bash語法。

$0 ?表示當(dāng)前腳本的名字

$@ ?表示當(dāng)前腳本執(zhí)行的所有參數(shù)

exec scala "$0" "$@" ? ?表示用scala命令,帶參數(shù),執(zhí)行當(dāng)前腳本

exec ?sh "$0 ?在這個(gè)文件里,exec sh ?$0是什么意思?

############

#!/bin/sh

echo ?"Hello!"

sleep 2

execsh?"$0"

#############

$0 ? 是位置參數(shù),表示腳本名稱

$1 ? 表示腳本的第一個(gè)參數(shù),依次類推直到$9

exec用于執(zhí)行命令、或腳本、或外部可執(zhí)行程序,會(huì)新建一個(gè)shell去執(zhí)行

綜上,這里exec sh ?"$0" ?就是執(zhí)行腳本本身

所以,就是一個(gè)循環(huán)過程,每隔兩秒打印一次 Hello

#############

#!/bin/sh

echo ?"Hello!"

sleep 2

exec ??"$0"

#############

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 官網(wǎng) 中文版本 好的網(wǎng)站 Content-type: text/htmlBASH Section: User ...
    不排版閱讀 4,744評(píng)論 0 5
  • 什么是運(yùn)維 術(shù)語名詞 IDC--(Internet Data Center)互聯(lián)網(wǎng)數(shù)據(jù)中心,主要服務(wù)包括整機(jī)租用、...
    lyh165閱讀 2,881評(píng)論 0 19
  • 內(nèi)容一:Shell腳本語言-管道? ?分析場景:有的時(shí)候我們需要一個(gè)命令的輸出作為另外一個(gè)命令輸入? ?? ?語法...
    Jackey_song閱讀 507評(píng)論 0 1
  • .bat腳本基本命令語法 目錄 批處理的常見命令(未列舉的命令還比較多,請(qǐng)查閱幫助信息) 1、REM 和 :: 2...
    慶慶慶慶慶閱讀 8,542評(píng)論 1 19
  • 2017年5月3日 還記得參加高考那一年是2011年; 時(shí)間一下就過去了6年了,今天偶然間踩著單車經(jīng)過這里。這里依...
    大杯美年達(dá)閱讀 258評(píng)論 0 0

友情鏈接更多精彩內(nèi)容