額外的重定向運(yùn)算符
使用 set -C 搭配
POSIX shell 提供了防止文件意外截?cái)嗟倪x項(xiàng):執(zhí)行 set -C 命令可打開(kāi) shell 所謂的禁止覆蓋選項(xiàng),當(dāng)它再打開(kāi)狀態(tài)時(shí),單純的>重定向遇到目標(biāo)文件已存在時(shí),就會(huì)失敗.>|運(yùn)算符則可以另 noclobber 選項(xiàng)失效.
提供行內(nèi)輸入的<<和<<-:使用 program<<得力 miter,可以在 shell 腳本正文內(nèi)提供輸入數(shù)據(jù);這樣數(shù)據(jù)叫嵌入文件.在默認(rèn)情況下,shell 可以在嵌入文件正文內(nèi)做變量.命令和算數(shù)替換.
#!/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
分析:其中郵件內(nèi)容就是輸入數(shù)據(jù).
如果界定符以任何一種形式的引號(hào)括起來(lái),shell 便不會(huì)處理輸入的內(nèi)文,案例:
[root@localhost tmp]# i=5
[root@localhost 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
)
界定符沒(méi)有任何引號(hào)隔開(kāi)
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
嵌入文件重定向器的第二種形式有一個(gè)負(fù)號(hào)結(jié)尾.這種情況下,所有開(kāi)頭的制表符(Tab)在傳遞給程序作為輸入之前,都從嵌入文件與結(jié)束定界符中刪除(注意:只有開(kāi)頭的制表符會(huì)被刪除,開(kāi)頭的空格不會(huì)刪除).這么做,讓 shell 腳本更易于閱讀了.
以<>打開(kāi)一個(gè)文件作為輸入輸出只用
使用 program<>file,可供讀取與寫(xiě)入操作.默認(rèn)是在標(biāo)準(zhǔn)輸入上打開(kāi) file.一般來(lái)說(shuō),<以只讀模式打開(kāi)文件,而>以只讀模式打開(kāi).<>運(yùn)算符則是以讀取與寫(xiě)入兩種模式打開(kāi)給定的文件.這交由 program 確定并充分利用;實(shí)際上,使用這個(gè)操作符并不需要太多的支持.
文件描述符處理
linux 用文件描述符來(lái)標(biāo)示每一個(gè)文件對(duì)象.文件描述符是一個(gè)非負(fù)整數(shù),可以唯一的標(biāo)示回話中打開(kāi)的文件.
bash 保留了 3 個(gè)文件描述符
文件描述符 |
縮寫(xiě) |
描述 |
0 |
STDIN |
標(biāo)準(zhǔn)輸入 |
1 |
STDOUT |
標(biāo)準(zhǔn)輸出 |
2 |
STDERR |
標(biāo)準(zhǔn)錯(cuò)誤 |
STDIN 文件描述符代表 shell 的標(biāo)準(zhǔn)輸入,對(duì)于終端來(lái)說(shuō),白鳥(niǎo)準(zhǔn)輸入就是鍵盤(pán).
在使用輸入重定向符號(hào)(<)時(shí),linux 會(huì)用重定向指定的文件來(lái)替換標(biāo)準(zhǔn)輸入文件描述符.
STDOUT 文件描述符代表標(biāo)準(zhǔn)的 shell 輸出.在終端上,標(biāo)準(zhǔn)輸出就是顯示器.
使用輸出重定向符號(hào)(>,>>),可以將要輸出到顯示上的內(nèi)容從定向到指定的文件中.
STDERR 文件描述符用來(lái)處理錯(cuò)誤消息,它代表 shell 的標(biāo)準(zhǔn)錯(cuò)誤輸出.
默認(rèn)情況下 STDOUT 和 STDERR 指向同樣的地方,默認(rèn)情況下,錯(cuò)誤消息也會(huì)輸出到顯示器輸出.
重定向錯(cuò)誤輸出
只重定向錯(cuò)誤,如下:在上面的表中看到 STDERR 文件描述符被設(shè)置成 2
[root@localhost tmp]# ls t 2>error
[root@localhost tmp]# cat error
ls: 無(wú)法訪問(wèn) t: 沒(méi)有那個(gè)文件或目錄
重定向錯(cuò)誤和數(shù)據(jù):
[root@localhost tmp]# mkdir task
[root@localhost tmp]# cd task/
[root@localhost task]# mkdir task
[root@localhost task]# ls task t 2>error 1>list
[root@localhost task]# cat list
task:
[root@localhost task]# cat error
ls: 無(wú)法訪問(wèn) t: 沒(méi)有那個(gè)文件或目錄
分析:如果出現(xiàn)錯(cuò)誤,就將錯(cuò)誤信息放入 error;如果正確,就將輸出信息放到 list 中.
也可以將 STDOUT 和 STDERR 輸出到同一個(gè)文件:
[root@localhost tmp]# mkdir task
[root@localhost tmp]# ls task t&>out
[root@localhost tmp]# cat out
ls: 無(wú)法訪問(wèn) t: 沒(méi)有那個(gè)文件或目錄
task:
在腳本中重定向輸出有兩種方式:
先看第一種----臨時(shí)重定向
如要故意在腳本中生成錯(cuò)誤消息,需要將單獨(dú)的一行(echo &”error msg>” &2)輸出重定向到 STDERR.
案例:
#!/bin/bash
echo "error msg" >&2
echo "normal msg"
執(zhí)行腳本,輸出結(jié)果:
error msg
normal msg
分析:在重定向文件描述符時(shí),你必須在文件描述符數(shù)字和輸出重定向符號(hào)之間加上一個(gè)&符號(hào).
默認(rèn)情況下,linux 會(huì)將 STDERR 定向到 TDOUT.但是,如果在運(yùn)行腳本時(shí)重定向了 STDERR,腳本中所有定向到 STDERR 的文本都會(huì)被重定向,案例:
[root@localhost tmp]# ./test.sh 2>test
normal msg
[root@localhost tmp]# cat test
error msg
分析:把執(zhí)行腳本的標(biāo)準(zhǔn)錯(cuò)誤輸出重定向到 test,而在上一步中,將”error msg”定向到了標(biāo)準(zhǔn)錯(cuò)誤輸出.
第二種----永久重定向
如果在腳本中有大量數(shù)據(jù)需要重定向,可以使用 exec 命令告訴 shell 在腳本執(zhí)行期間重定向到某個(gè)特定文件描述符:
bash 代碼:
#!/bin/bash
exec 1>testout
echo "error msg2"
echo "normal msg2"
echo "error msg1"
echo "normal msg1"
執(zhí)行:
[root@localhost tmp]# ./test1.sh
[root@localhost tmp]# cat testout
error msg2
normal msg2
error msg1
normal msg1
在腳本中重定向輸入:
使用 exec 命令將 STDIN 重定向到 linux 系統(tǒng)上的文件中:
exec 0< testfile
這個(gè)命令告訴 shell 從文件 testfile 中獲得輸入,而不是 STDIN.
擴(kuò)展 exec 命令:
語(yǔ)法:exec [ program [arguments...] ]
用途:
以新的程序取代 shell,或改變 shell 本身的 I/O 設(shè)置.
主要選項(xiàng):
無(wú)
行為:
搭配參數(shù)----也就是使用指定的程序取代 shell,以傳遞參數(shù)給它.如果只是用 I/O 重定向,則會(huì)改變 shell 本身的文件描述符.
具體的參考:
http://www.cnblogs.com/peida/archive/2012/11/14/2769248.html