trap
例如,指南庫腳本不會被意外中斷,但是某些人在運行該庫時會突然或無意中給您Ctrl +C,這就尷尬了。
有沒有辦法讓我們的腳本在碰到ctrl+c時,還能繼續(xù)執(zhí)行,或者收到ctrl+c的終止執(zhí)行的信號時,告訴執(zhí)行者,此腳本執(zhí)行時不能被隨意中斷。
有,bash允許內(nèi)容對一些信號量捕獲,可以在收到信號后執(zhí)行指定的操作
信號,用kill或者快捷鍵發(fā)給指定的進(jìn)程,進(jìn)程收到后安裝預(yù)設(shè)的規(guī)則處理,使用kill -l 可以查看系統(tǒng)可用的信號。
信號9,15 不可捕獲,這些信號必須由操作系統(tǒng)處理,否則你寫個死循環(huán),kill -9 都?xì)⒉涣?,系統(tǒng)就崩了。
常用的快捷鍵信號
SIGINT,2,ctrl+c
SIGTSTP,18,ctrl+z,暫停
trap 'func "abc"' SIGINT,收到這個信號時,執(zhí)行指定的代碼
trap -- SIGINT,刪除信號追蹤
腳本示例
#! /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í)行一個字符串,先把字符串中的變量替換為實際值
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í)行一個命令,把命令加載到當(dāng)前的bash環(huán)境中執(zhí)行,把當(dāng)前bash的數(shù)據(jù)
所以exec執(zhí)行后,執(zhí)行棧會返回到當(dāng)前bash的上一層,因為當(dāng)前的bash環(huán)境已經(jīng)被exec替換了
# su - user1
$ exec ls
ls執(zhí)行完,會返回到root的環(huán)境下
time
記錄程序執(zhí)行的時間
還有一個time程序,比bash內(nèi)置的time功能要多一點,可以用 \time ls,明確使用time程序而非bash的命令
umask
設(shè)置文件或者目錄的權(quán)限掩碼
在一個目錄里設(shè)置權(quán)限掩碼,那么這個目錄里面新建的文件的權(quán)限規(guī)則是,目錄:777-umask值,文件,666-umask值