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

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

關(guān)于重定向

  • 額外的重定向運(yùn)算符
  • 使用 set -C 搭配
  • POSIX shell 提供了防止文件意外截?cái)嗟倪x項(xiàng): 執(zhí)行 set -C 命令可打開 shell 所謂的禁止覆蓋選項(xiàng),當(dāng)它再打開狀態(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)括起來,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)

界定符沒有任何引號(hào)隔開:

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é)尾。這種情況下,所有開頭的制表符 (Tab) 在傳遞給程序作為輸入之前,都從嵌入文件與結(jié)束定界符中刪除 (注意: 只有開頭的制表符會(huì)被刪除,開頭的空格不會(huì)刪除)。這么做,讓 shell 腳本更易于閱讀了。
  • <> 打開一個(gè)文件作為輸入輸出只用
  • 使用 program<>file,可供讀取與寫入操作。默認(rèn)是在標(biāo)準(zhǔn)輸入上打開 file。一般來說,< 以只讀模式打開文件,而 > 以只讀模式打開。<> 運(yùn)算符則是以讀取與寫入兩種模式打開給定的文件。這交由 program 確定并充分利用;實(shí)際上,使用這個(gè)操作符并不需要太多的支持。

文件描述符處理

linux 用文件描述符來標(biāo)示每一個(gè)文件對(duì)象。文件描述符是一個(gè)非負(fù)整數(shù),可以唯一的標(biāo)示回話中打開的文件。

bash 保留了 3 個(gè)文件描述符

文件描述符
縮寫
描述
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ì)于終端來說,白鳥準(zhǔn)輸入就是鍵盤。在使用輸入重定向符號(hào) (<) 時(shí),linux 會(huì)用重定向指定的文件來替換標(biāo)準(zhǔn)輸入文件描述符。
  • STDOUT 文件描述符代表標(biāo)準(zhǔn)的 shell 輸出。在終端上,標(biāo)準(zhǔn)輸出就是顯示器。使用輸出重定向符號(hào) (>,>>),可以將要輸出到顯示上的內(nèi)容從定向到指定的文件中。
  • STDERR 文件描述符用來處理錯(cuò)誤消息,它代表 shell 的標(biāo)準(zhǔn)錯(cuò)誤輸出。
  • 默認(rèn)情況下 STDOUTSTDERR 指向同樣的地方,默認(rèn)情況下,錯(cuò)誤消息也會(huì)輸出到顯示器輸出。

重定向錯(cuò)誤輸出

只重定向錯(cuò)誤,如下:在上面的表中看到 STDERR 文件描述符被設(shè)置成 2

[root@localhost tmp]# ls t 2>error
[root@localhost tmp]# cat error 

ls: 無法訪問 t:沒有那個(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:無法訪問 t:沒有那個(gè)文件或目錄

分析:

  • 如果出現(xiàn)錯(cuò)誤,就將錯(cuò)誤信息放入 error;如果正確,就將輸出信息放到 list 中。
  • 也可以將 STDOUTSTDERR 輸出到同一個(gè)文件:
[root@localhost tmp]# mkdir task
[root@localhost tmp]# ls task t&>out
[root@localhost tmp]# cat out       

ls: 無法訪問 t:沒有那個(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 定向到 STDOUT。但是,如果在運(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 命令

語法: exec [program [arguments...] ]

用途: 以新的程序取代 shell,或改變 shell 本身的 I/O 設(shè)置。

主要選項(xiàng): 無

行為: 搭配參數(shù)----也就是使用指定的程序取代 shell,以傳遞參數(shù)給它。如果只是用 I/O 重定向,則會(huì)改變 shell 本身的文件描述符。

具體的參考: http://www.cnblogs.com/peida/archive/2012/11/14/2769248.html