Linux命令列與shell指令碼程式設計大全(三)
十二、呈現資料
輸入和輸出
標準檔案描述符
0 STDIN 標準輸入
1 STDOUT 標準輸出
2 STDERR 標準錯誤
重定向錯誤
1.只重定向錯誤
ls -al badfile 2>test1 ##2>表示只重定向錯誤
2.重定向錯誤和資料
ls -al test test2 test3 badtest 2>test4 1>test5
### 2>表示將錯誤重定向到test4檔案,1>表示將標準輸出重定向到test5檔案
ls -al test test3 test4 badtest &> test7
### &>會將所有的輸出傳送到同一個檔案,包括錯誤和資料
在指令碼中重定向輸出
1.臨時重定向
使用輸出重定向符來講輸出資訊重定向到STDERR檔案描述符。在重定向到檔案描述符時,必須在檔案描述符數字前加一個&
2. 永久重定向
使用exec命令告訴shell在指令碼執行期間重定向某個特定檔案描述符。
## 臨時重定向,使用&
echo "this is an error" >&2
echo "this is normal output"
## 永久重定向,使用exec命令
exec 2>testerror #重定向標準錯誤
echo "this is the start of the script" ##正常在螢幕顯示
echo "now redirecting all output to another location" ##同上
exec 1>testout ##重定向標準輸出
echo "this is a test should go to testout file" ##在testout檔案中
echo "this line should go to testerror file" >&2 ##在testerror檔案中
在指令碼中重定向輸入
exec命令允許將STDIN重定向到Linux系統上的檔案中。
exec 0<test14_2.sh ##重定向輸入
count=1
while read line
do
echo "line #$count : $line"
count=$[ $count + 1 ]
done
建立自己的重定向
## 1 建立輸出檔案描述符
exec 3>testout
echo "this should be stored in the file " >&3
echo "this should be on the screen"
## 2 重定向檔案描述符
exec 3>&1 ##描述符3重定向為描述符1,即STDOUT
exec 1>testout ##STDOUT重定向到檔案
echo "this should store in the output file"
echo "along with this line"
exec 1>&3 ##STDOUT重定向到顯示器
echo "now things should be back to normal"
## 3 建立輸入檔案描述符
exec 6<&0
exec 0<test14_2.sh
count=1
while read line
do
echo "line #$count : $line"
count=$[ $count + 1 ]
done
exec 0<&6
read -p "Are you done now? [Y/N]: " answer
case $answer in
Y|y) echo "Goodbye" ;;
N|n) echo "sorry,this is the end." ;;
esac
## 4 檔案讀寫描述符,需要特別小心使用,使用<>
exec 3<>testfile
read line <&3
echo "read : $line"
echo "this is a test line." >&3
## 5 關閉檔案描述符,使用&-,一旦關閉,在指令碼就不能在使用
exec 3>&-
列出開啟檔案描述符
## 列出開啟的檔案描述符 lsof命令
## lsof -a -p $$ -d 0,1,2,3,4,5,6,7,8,9
exec 3>testfile1
exec 5<testfile2
exec 8<testfile
/usr/bin/lsof -a -p $$ -d0,1,2,3,5,8
阻止命令輸出
可以將STDERR重定向到一個叫做null檔案的特殊檔案,該檔案位置為/dev/null
ls -al >/dev/null
建立臨時檔案
mktemp testing.XXXXXX
指定一個檔名模板,模板可以包含任意文字檔名,在檔名末尾加上6個X就可以了。mktemp命令會用6個字元替換這6個X,該檔案在系統啟動時不會被刪除。-t選項會強制mktemp命令在系統的臨時目錄建立檔案,使用這個選項,mktemp命令會返回臨時檔案的全路徑,在/tmp目錄中的檔案會在系統啟動時被刪除。-d選項會建立一個臨時目錄
##建立臨時檔案
# 本地臨時檔案 mktemp testing.XXXXXX,mktemp會用6個字元替換這6個X,保證檔名在目錄中是唯一的
# -t選項會強制mktemp命令在/tmp目錄中建立檔案,返回檔案的全路徑,該檔案在系統啟動時會被刪除
# -d選項會建立一個臨時目錄
tempfile=$(mktemp test.XXXXXX)
exec 3>$tempfile
echo "This script writes to temp file $tempfile"
echo "This is the first line" >&3
echo "This is the second line" >&3
echo "This is the thrid line" >&3
exec 3>&-
echo "Done creating temp file.The contents are:"
cat $tempfile
rm -f $tempfile 2> /dev/null
記錄訊息
tee命令可以將輸出同時傳送到顯示器和日誌檔案,命令格式: tee filename,-a選項會將資料追加到檔案中
## 記錄訊息
# tee命令會將輸出同時傳送到顯示器和日誌檔案,用法tee filename
# 例如: date | tee -a testfile
# -a選項會將資料追加到檔案中
十三、控制指令碼
處理訊號
1.Linux常用訊號
訊號 值 描述
1 SIGHUP 掛起程序
2 SIGINT 終止程序
3 SIGQUIT 停止程序
9 SIGKILL 無條件終止程序
15 SIGTERM 儘可能終止程序
17 SIGSTOP 無條件停止程序,但不是終止程序
18 SIGTSTP 停止或暫停程序,但不終止程序
19 SIGCONT 繼續執行停止的程序
2.生成訊號: 中斷程序 Ctrl+C 暫停程序 Ctrl+Z
##捕獲訊號
trap commands signals
3.捕獲指令碼退出
trap commands EXIT
4.修改或移除捕獲,如果一個訊號在捕獲被修改前接收到,指令碼仍然會根據最初的trap命令進行處理。
## 使用trap捕獲訊號
trap "echo 'sorry,I have trapped ctrl-c'" SIGINT
count=1
while [ $count -le 10 ]
do
echo "Loop #$count"
sleep 1
count=$[ $count + 1 ]
done
# 修改捕獲,捕獲指令碼退出
trap "echo goodbye..." EXIT
# 移除捕獲
trap -- SIGINT
以後臺模式執行指令碼
1.後臺執行指令碼,在命令後加上 & 符就可以了,終端會話推出,後臺程序也會隨之退出。
2.在非控制檯下執行指令碼,使用nohup命令
nohup ./test1.sh &
作業控制
1.檢視作業: jobs ,帶加號的作業會被當作預設作業,帶減號的作業為下一個預設作業,任何時候只有一個帶加號的作業和一個帶減號的作業
2.重啟停止的作業 :
後臺模式重啟: bg 加作業號
前臺模式重啟: fg 加作業號
調整謙讓度
排程優先順序從-20(最高優先順序)到+19(最低優先順序),預設情況下,shell以優先順序0啟動所有程序
1. nice命令讓命令以更低的優先順序執行,不能調高優先順序:
nice -n 10 ./test4.sh> test4.out &(或者可以直接去掉n)
nice -10 ./test4.sh> test4.out &(直接去掉n)
2. renice命令:改變系統上已經執行命令的優先順序
renice -n 10 -p 5055 ##(5055程序優先順序調低到10)
# 只能對屬於你的程序執行renice
# 只能通過renice降低程序的優先順序
# root使用者可以通過renice來任意調整程序的優先順序(可以調高優先順序)
定時執行作業
1. at命令
基本格式 at [-f filename] time
時間格式: 標準的小時和分鐘格式,如10:15
AM/PM指示符,如10:15 PM
特定可命名時間,如now,noon,midnight,teetime
標準日期格式,如MMDDYY,MM/DD/YY或DD.MM.YY
文字格式如Jul 4或Dec 25
指定時間增量 當前時間+25min, 明天10:15pm,10:17+7天
atq可以檢視系統中有哪些作業在等待
atrm可以刪除等待中的作業
2.需要定期執行的指令碼
-- cron時間表
格式: min hour dayofmonth month dayofweek command1
允許使用特定值、取值範圍、或者萬用字元來指定條目。
-- 構建cron時間表 crontab -l
-- 瀏覽cron目錄
/etc/目錄下有四個基本目錄.hourly,daily,weekly,monthly,如果指令碼需要每天執行一次,吧指令碼複製到daily目錄就可以了
-- anacron程式
某作業由於關機錯過了執行時間,anacron會盡快執行該作業,只會處理位於cron目錄,一般在/etc/anacrontab檔案中
格式 : period delay identifier command
peroid定義作業多久執行一次,以天為單位,identifier條目是一種特別的非空字串,用於唯一標識日誌錯誤和錯誤郵件中的作業。command條目包含了run-parts程式和一個cron指令碼目錄名。
使用新shell啟動指令碼
使用者登入會按照順序查詢如下檔案,當找到順序值低的檔案時,不再繼續查詢:
$HOME./bashrc,$HOME/.bash_profile,$HOME/.bash_login,$HOME/.profile