天天看點

shell 重定向與檔案描述符

【解釋】

重定向: 是動作,一種操作的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&gt; file3.txt</code>

<code>echo</code> <code>"first line 1"</code>

<code>echo</code> <code>"first line 3"</code> <code>&gt;&amp;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&lt; </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&gt;&gt; </code><code>/etc/issue</code>

<code>echo</code> <code>"this is last file"</code> <code>&gt;&amp;3</code>

<code>exec</code> <code>3&gt;&amp;-</code>

<code>echo</code> <code>"test output"</code> <code>&gt;&amp;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

繼續閱讀