【解釋】
重定向: 是動作,一種操作的action行為
檔案描述符: 名詞,檔案的另一種表示,linux一切皆檔案。
【基礎重定向形式】
<
輸入重定向
用途星級: **
<<
here-document 輸入重定向
用途星級: ***
>
輸出重定向
用途星級: *****
>>
追加
一、< 用法: cat 作為代表
cat功能:Concatenate FILE(s), or standard input, to standard output.
1 連接配接檔案,輸出到标準輸出(即列印到螢幕)
2 标準輸入,到标準輸出(即列印到螢幕)
cat /etc/issue 等于 cat < /etc/issue
但是左邊用的是cat第一種功能, 右邊用的是cat的第二種功能。
二、<< 的用法: 以word開始,以delimiter(和word要一樣)結束,中間的就是文檔内容了。cat作為代表
<<[-]word
here-document
delimiter
[root@master std]# cat << EOF
> i am linux
> yes.
> EOF
i am linux
yes.
[root@master std]
注意:<< 文檔here-document作為輸入,cat在将here-document輸出到螢幕上。
常用:在shell腳本中
三、> 的用法:
1 清空一個檔案
> youfile
2 清空檔案内容,在把新内容寫入
echo "you content" > file.txt
四、>> 追加的用法 把内容追加到檔案中
echo "test message" >> /var/log/message
【基礎檔案描述符形式】
數字代号
意義
用途
标準輸入 STDIN
*****
1
标準輸出 STDOUT
2
錯誤輸出 STDERR
【檔案描述符和重定向的結合】
預設
< 等于 0< 标準輸入
> 等于 1> 标注輸出重定向
>> 等于1>> 标準輸出追加
其他
2> 就隻能 2> 錯誤輸出重定向
2>> 就隻能 >> 錯誤輸出追加
&> 等于 > file 2>&1 标準輸出和錯誤輸出 重定向,隻打開了一次檔案。
&>> 等于 >> file 2>&1 标準輸出和錯誤輸出 追加,隻打開了一次檔案。
這裡有一點需要了解,
為什麼是
&>> 等于 >> file 2>&1 而不是 >> file 2>>&1 這個會報錯。
因為開始打開檔案file,是追加形式,是以2>&1 就可以表示的是把錯誤輸出到那個檔案中即可(檔案已已經打開且光标已經在行尾)。
重定向和追加的差別是:第一次打開檔案的時候,是否把檔案清空,定義光标的開始處。從首行第一個字元開始寫入。
方式+寫入=結果
分析一下幾個echo
echo "abc" > test.txt
echo "error" >> text.txt
echo "abc" >&2 #這一行表示的是錯誤輸出 等于echo "abc" 1>&2,前面是一個預設簡寫而已
【自定義檔案描述符】
建立自己的重定向,在shell中不局限與 0 1 2 這個三個預設的檔案描述符。其實在shell中最多可以有9個打開的檔案描述符。其他6個分别是3-8。并且可以當作輸入輸出重定向都可以。
可以将這些檔案描述符中的任意一個配置設定給一個檔案。
例子1:建立輸出檔案描述符
[root@master std]# cat test.sh
<code>#/bin/bash</code>
<code>exec</code> <code>3> file3.txt</code>
<code>echo</code> <code>"first line 1"</code>
<code>echo</code> <code>"first line 3"</code> <code>>&3</code>
注:exec執行将檔案描述符3重定向到file3.txt這個檔案中。
體會下結果吧
[root@master std]# sh test.sh
first line 1
[root@master std]# cat file3.txt
first line 3
例子2: 腳本中檔案作為重定向輸入
<code>exec</code> <code>0< </code><code>/etc/issue</code>
<code>while</code> <code>read</code> <code>line; </code><code>do</code>
<code> </code><code>echo</code> <code>$line</code>
<code>done</code>
解釋: 将檔案/etc/issue 作為0檔案描述符的輸入。
read line預設為從檔案描述符0(鍵盤)讀入,二此時exec已經定義了輸入來自/etc/issue檔案,是以read 會去讀/etc/issue這個檔案,把當讀取的一行的内容,指派給line這個變量。while在循環讀取檔案中的一下行.....
等價于
<code>cat</code> <code>/etc/issue</code> <code>|</code><code>while</code> <code>read</code> <code>line; </code><code>do</code>
例子3: 關閉打開的檔案描述符
<code>exec</code> <code>3>> </code><code>/etc/issue</code>
<code>echo</code> <code>"this is last file"</code> <code>>&3</code>
<code>exec</code> <code>3>&-</code>
<code>echo</code> <code>"test output"</code> <code>>&3</code>
注意:一旦關閉了檔案描述符,就不能在腳本中向它寫入任何資料了,否則shell會生成錯誤消息。
[root@master std]# sh test.sh
test.sh: line 7: 3: Bad file descriptor
【至此】
你一定會很關系exec這個指令是幹嘛的? 和source 和sh執行一個腳本有何不同?
看下篇。
本文轉自殘劍部落格51CTO部落格,原文連結http://blog.51cto.com/cuidehua/1832007如需轉載請自行聯系原作者
cuizhiliang