鍍金池/ 教程/ Linux/ shell 學(xué)習(xí)三十三天---關(guān)于重定向
shell 學(xué)習(xí)四十五天---xargs
shell學(xué)習(xí)第三天
shell 學(xué)習(xí)十五天---join 連接字段
shell 學(xué)習(xí)第二天
shell 學(xué)習(xí)四十三天---臨時(shí)性文件的建立與使用
shell 學(xué)習(xí)第六天---小結(jié)
shell 學(xué)習(xí)三十三天---關(guān)于重定向
shell 學(xué)習(xí)二十九天---循環(huán)
shell 學(xué)習(xí)二十四天---提取開(kāi)頭或結(jié)尾數(shù)行
shell 學(xué)習(xí)第十天---sed 查找與替換
shell 學(xué)習(xí)第十一天---sed 正則的精確控制
shell 學(xué)習(xí)三十天---break,continue,shift,getopts
shell 學(xué)習(xí)---小結(jié)
shell 學(xué)習(xí)三十一天---函數(shù)問(wèn)題
shell 學(xué)習(xí)第四天---華麗的 printf 輸出
shell 學(xué)習(xí)三十五天---波浪號(hào)展開(kāi)與通配符
shell 學(xué)習(xí)十九天---文本塊排序
shell 學(xué)習(xí)十二天---行與字符串
shell 學(xué)習(xí)二十一天---重新格式化段落
shell 學(xué)習(xí)十八天---文本排序
shell 學(xué)習(xí)十三天---sed 案例分析
shell 學(xué)習(xí)四十一天---列出文件 ls 和 od 命令
shell 學(xué)習(xí)十七天---awk 命令
shell 學(xué)習(xí)三十六天---命令替換
shell 學(xué)習(xí)十六天---join 練習(xí)
shell 學(xué)習(xí)三十二天---read 讀取一行
shell 學(xué)習(xí)二十二天---計(jì)算行數(shù),字?jǐn)?shù)以及字符數(shù)
shell 學(xué)習(xí)小總結(jié)---本章小結(jié)
shell 學(xué)習(xí)第八天---擴(kuò)展正則表達(dá)式(ERE)
shell 學(xué)習(xí)四十二天---使用 touch 更新文件時(shí)間
shell 學(xué)習(xí)二十八天---case 語(yǔ)句
shell 學(xué)習(xí)三十九天---內(nèi)建命令
shell 學(xué)習(xí)第一天
shell 學(xué)習(xí)三十四天---printf 詳解
shell 學(xué)習(xí)二十六天---變量與算數(shù)
shell 學(xué)習(xí)三十八天---執(zhí)行順序和 eval
shell 學(xué)習(xí)四十四天---尋找文件
shell 學(xué)習(xí)二十五天---神器的管道符
shell 學(xué)習(xí)十四天---使用 cut 選定字段
shell 學(xué)習(xí)第五天---基本的I/O重定向
shell 學(xué)習(xí)四十天---awk 的驚人表現(xiàn)
shell 學(xué)習(xí)二十天---sort 的其他內(nèi)容以及 uniq 命令
shell 學(xué)習(xí)二十三天---打印
shell 學(xué)習(xí)第九天---分組
shell 學(xué)習(xí)四十八天---文件校驗(yàn)和匹配
shell 學(xué)習(xí)二十七天---退出狀態(tài)和 if 語(yǔ)句
shell 學(xué)習(xí)四十七天---文件比較 cmp,diff,patch
shell 學(xué)習(xí)第七天---基礎(chǔ)正則表達(dá)式(BRE)
shell 學(xué)習(xí)四十六天---文件系統(tǒng)的空間信息 df 和 du 命令
shell 學(xué)習(xí)三十七天---引用
shell 學(xué)習(xí)小結(jié)

shell 學(xué)習(xí)三十三天---關(guān)于重定向

額外的重定向運(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:
在腳本中重定向輸出有兩種方式:

  1. 臨時(shí)重定向每行輸出
  2. 永久重定向腳本中的所有命令

先看第一種----臨時(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