標籤:終端 訊息 存在 time archive consumer ror mit 郵件
關於重新導向
額外的重新導向運算子
使用set -C搭配
POSIX shell提供了防止檔案意外截斷的選項:運行set -C命令可開啟shell所謂的禁止覆蓋選項,當它再開啟狀態時,單純的>重新導向遇到目標檔案已存在時,就會失敗.>|運算子則能夠另noclobber選項失效.
提供行內輸入的<<和<<-:使用program<<得力miter,能夠在shell指令碼本文內提供輸入資料;這樣資料叫嵌入檔案.在預設情況下,shell能夠在嵌入檔案本文內做變數.命令和算數替換.
#!/bin/bash
cd /home
du -s * |
sort -nr |
sed 10q |
while read amount name
do
mail -s "disk usage waring " $name<<EOF
Greetings ,You are one of the top of 10 consumers of disk ...
Please clean up unneeded files ,as soon as possible
Thanks .
EOF
done
分析:當中郵件內容就是輸入資料.
假設界定符以不論什麼一種形式的引號括起來,shell便不會處理輸入的內文,案例:
[[email protected] tmp]# i=5
[[email protected] tmp]# cat <<‘E‘OF
> this is the calue if i : $i
> here is a command sub :$(echo hello,world)
> EOF
this is the calue if i : $i
here is a command sub :$(echo hello,world)
界定符沒有不論什麼引號隔開
cat <<EOF
> this is the calue if i : $i
> here is a command sub :$(echo hello,world)
> EOF
this is the calue if i : 5
here is a command sub :hello,world
嵌入檔案重新導向器的另外一種形式有一個負號結尾.這樣的情況下,全部開頭的定位字元(Tab)在傳遞給程式作為輸入之前,都從嵌入檔案與結束定界符中刪除(注意:僅僅有開頭的定位字元會被刪除,開頭的空格不會刪除).這麼做,讓shell指令碼更易於閱讀了.
以<>開啟一個檔案作為輸入輸出僅僅用
使用program<>file,可供讀取與寫入操作.預設是在標準輸入上開啟file.一般來說,<以僅僅讀模式開啟檔案,而>以僅僅讀模式開啟.<>運算子則是以讀取與寫入兩種模式開啟給定的檔案.這交由program確定並充分利用;實際上,使用這個操作符並不須要太多的支援.
檔案描寫敘述符處理
linux用檔案描寫敘述符來標示每個檔案對象.檔案描寫敘述符是一個非負整數,能夠唯一的標示回話中開啟的檔案.
bash保留了3個檔案描寫敘述符
檔案描寫敘述符 |
縮寫 |
描寫敘述 |
0 |
STDIN |
標準輸入 |
1 |
STDOUT |
標準輸出 |
2 |
STDERR |
標準錯誤 |
STDIN檔案描寫敘述符代表shell的標準輸入,對於終端來說,白鳥准輸入就是鍵盤.
在使用輸入重新導向符號(<)時,linux會用重新導向指定的檔案來替換標準輸入檔案描寫敘述符.
STDOUT檔案描寫敘述符代表標準的shell輸出.在終端上,標準輸出就是顯示器.
使用輸出重新導向符號(>,>>),能夠將要輸出到顯示上的內容從定向到指定的檔案裡.
STDERR檔案描寫敘述符用來處理錯誤訊息,它代表shell的標準錯誤輸出.
預設情況下STDOUT和STDERR指向相同的地方,預設情況下,錯誤訊息也會輸出到顯示器輸出.
重新導向錯誤輸出
僅僅重新導向錯誤,例如以下:在上面的表中看到STDERR檔案描寫敘述符被設定成2
[[email protected] tmp]# ls t 2>error
[[email protected] tmp]# cat error
ls: 無法訪問t: 沒有那個檔案或檔案夾
重新導向錯誤和資料:
[[email protected] tmp]# mkdir task
[[email protected] tmp]# cd task/
[[email protected] task]# mkdir task
[[email protected] task]# ls task t 2>error 1>list
[[email protected] task]# cat list
task:
[[email protected] task]# cat error
ls: 無法訪問t: 沒有那個檔案或檔案夾
分析:假設出現錯誤,就將錯誤資訊放入error;假設正確,就將輸出資訊放到list中.
也能夠將STDOUT和STDERR輸出到同一個檔案:
[[email protected] tmp]# mkdir task
[[email protected] tmp]# ls task t&>out
[[email protected] tmp]# cat out
ls: 無法訪問t: 沒有那個檔案或檔案夾
task:
在指令碼中重新導向輸出有兩種方式:
1.暫時重新導向每行輸出
2.永久重新導向指令碼中的全部命令
先看第一種----暫時重新導向
如要有益在指令碼中建置錯誤訊息,須要將單獨的一行(echo &”error msg>” &2)輸出重新導向到STDERR.
案例:
#!/bin/bash
echo "error msg" >&2
echo "normal msg"
運行指令碼,輸出結果:
error msg
normal msg
分析:在重新導向檔案描寫敘述符時,你必須在檔案描寫敘述符數字和輸出重新導向符號之間加上一個&符號.
預設情況下,linux會將STDERR定向到STDOUT.可是,假設在執行指令碼時重新導向了STDERR,指令碼中全部定向到STDERR的文本都會被重新導向,案例:
[[email protected] tmp]# ./test.sh 2>test
normal msg
[[email protected] tmp]# cat test
error msg
分析:把運行指令碼的標準錯誤輸出重新導向到test,而在上一步中,將”error msg”定向到了標準錯誤輸出.
另外一種----永久重新導向
假設在指令碼中有大量資料須要重新導向,能夠使用exec命令告訴shell在指令碼運行期間重新導向到某個特定檔案描寫敘述符:
bash代碼:
#!/bin/bash
exec 1>testout
echo "error msg2"
echo "normal msg2"
echo "error msg1"
echo "normal msg1"
運行:
[[email protected] tmp]# ./test1.sh
[[email protected] tmp]# cat testout
error msg2
normal msg2
error msg1
normal msg1
在指令碼中重新導向輸入:
使用exec命令將STDIN重新導向到linux系統上的檔案裡:
exec 0< testfile
這個命令告訴shell從檔案testfile中獲得輸入,而不是STDIN.
擴充exec命令:
文法:exec [ program [arguments...] ]
用途:
以新的程式代替shell,或改變shell本身的I/O設定.
主要選項:
無
行為:
搭配參數----也就是使用指定的程式代替shell,以傳遞參數給它.假設僅僅是用I/O重新導向,則會改變shell本身的檔案描寫敘述符.
詳細的參考:
http://www.cnblogs.com/peida/archive/2012/11/14/2769248.html
shell學習三十三天----關於重新導向