linux基礎(chǔ)之信號(hào)捕獲bash5
trap
例如,指南庫(kù)腳本不會(huì)被意外中斷,但是某些人在運(yùn)行該庫(kù)時(shí)會(huì)突然或無(wú)意中給您Ctrl +C,這就尷尬了。
有沒(méi)有辦法讓我們的腳本在碰到ctrl+c時(shí),還能繼續(xù)執(zhí)行,或者收到ctrl+c的終止執(zhí)行的信號(hào)時(shí),告訴執(zhí)行者,此腳本執(zhí)行時(shí)不能被隨意中斷。
有,bash允許內(nèi)容對(duì)一些信號(hào)量捕獲,可以在收到信號(hào)后執(zhí)行指定的操作
信號(hào),用kill或者快捷鍵發(fā)給指定的進(jìn)程,進(jìn)程收到后安裝預(yù)設(shè)的規(guī)則處理,使用kill -l 可以查看系統(tǒng)可用的信號(hào)。
信號(hào)9,15 不可捕獲,這些信號(hào)必須由操作系統(tǒng)處理,否則你寫(xiě)個(gè)死循環(huán),kill -9 都?xì)⒉涣耍到y(tǒng)就崩了。
常用的快捷鍵信號(hào)
SIGINT,2,ctrl+c
SIGTSTP,18,ctrl+z,暫停
trap 'func "abc"' SIGINT,收到這個(gè)信號(hào)時(shí),執(zhí)行指定的代碼
trap -- SIGINT,刪除信號(hào)追蹤
腳本示例
#! /bin/bash
trap 'func "abc"' SIGINT
trap "echo Goodbye." EXIT
index=0
func() {
echo 'abc', $1
index=$[index+1]
if [ $index -ge 10 ]; then
trap -- SIGINT
fi
}
eval
執(zhí)行一個(gè)字符串,先把字符串中的變量替換為實(shí)際值
pipe="|"; eval ls $pipe wc -l
相當(dāng)于 sh -c "ls $pipe wc -l"
set ls pwd
eval $1 #第一次掃描到$1為ls,第二次執(zhí)行l(wèi)s
exec
執(zhí)行一個(gè)命令,把命令加載到當(dāng)前的bash環(huán)境中執(zhí)行,把當(dāng)前bash的數(shù)據(jù)
所以exec執(zhí)行后,執(zhí)行棧會(huì)返回到當(dāng)前bash的上一層,因?yàn)楫?dāng)前的bash環(huán)境已經(jīng)被exec替換了
# su - user1
$ exec ls
ls執(zhí)行完,會(huì)返回到root的環(huán)境下
time
記錄程序執(zhí)行的時(shí)間
還有一個(gè)time程序,比bash內(nèi)置的time功能要多一點(diǎn),可以用 \time ls,明確使用time程序而非bash的命令
umask
設(shè)置文件或者目錄的權(quán)限掩碼
在一個(gè)目錄里設(shè)置權(quán)限掩碼,那么這個(gè)目錄里面新建的文件的權(quán)限規(guī)則是,目錄:777-umask值,文件,666-umask值