set -C
搭配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è)文件作為輸入輸出只用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ò)誤輸出。STDOUT
和 STDERR
指向同樣的地方,默認(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è)文件或目錄
分析:
STDOUT
和 STDERR
輸出到同一個(gè)文件:[root@localhost tmp]# mkdir task
[root@localhost tmp]# ls task t&>out
[root@localhost tmp]# cat out
ls: 無法訪問 t:沒有那個(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
分析:
&
符號(hào)。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