echo "c.biancheng.net" 1>log.txt
檔案描述符表本質上是一個結構體陣列,假設這個結構體的名字叫做 FD。發生重定向時,Linux 系統首先會開啟 log.txt 檔案,並把各種資訊新增到 i-node 表和檔案開啟表,然後再建立一個 FD 變數(通過這個變數其實就能讀寫檔案了),並用這個變數給下標為 1 的陣列元素賦值,覆蓋原來的內容,這樣就改變了檔案指標的指向,完成了重定向。>
是輸出重定向符號,<
是輸入重定向符號;更準確地說,它們應該叫做檔案描述符操作符。> 和 < 通過修改檔案描述符改變了檔案指標的指向,所以能夠實現重定向的功能。<>
,它的效果是前面兩者的總和。分類 | 用法 | 說明 |
---|---|---|
輸出 | n>filename | 以輸出的方式開啟檔案 filename,並繫結到檔案描述符 n。n 可以不寫,預設為 1,也即標準輸出檔案。 |
n>&m |
用檔案描述符 m 修改檔案描述符 n,或者說用檔案描述符 m 的內容覆蓋檔案描述符 n,結果就是 n 和 m 都代表了同一個檔案,因為 n 和 m 的檔案指標都指向了同一個檔案。 因為使用的是 > ,所以 n 和 m 只能用作命令的輸出檔案。n 可以不寫,預設為 1。 |
|
n>&- | 關閉檔案描述符 n 及其代表的檔案。n 可以不寫,預設為 1。 | |
&>filename | 將正確輸出結果和錯誤資訊全部重定向到 filename。 | |
輸入 | n<filename | 以輸入的方式開啟檔案 filename,並繫結到檔案描述符 n。n 可以不寫,預設為 0,也即標準輸入檔案。 |
n<&m |
類似於 n>&m,但是因為使用的是< ,所以 n 和 m 只能用作命令的輸入檔案。n 可以不寫,預設為 0。 |
|
n<&- | 關閉檔案描述符 n 及其代表的檔案。n 可以不寫,預設為 0。 | |
輸入和輸出 | n<>filename | 同時以輸入和輸出的方式開啟檔案 filename,並繫結到檔案描述符 n,相當於 n>filename 和 n<filename 的總和。。n 可以不寫,預設為 0。 |
command >file 2>&1
它省略了檔案描述符 1,所以等價於:command 1>file 2>&1
這個語句可以分成兩步:先執行1>file
,讓檔案描述符 1 指向 file;再執行2>&1
,用檔案描述符 1 修改檔案描述符 2,讓 2 和 1 的內容一樣。最終 1 和 2 都指向了同一個檔案,也就是 file。所以不管是向 1 還是向 2 中輸出內容,最終都輸出到 file 檔案中。1>file
,再執行2>&1
;如果寫作下面的形式,那就南轅北轍了:
command 2>&1 1>file
Shell 會先執行2>&1
,這樣 1 和 2 都指向了標準錯誤輸出檔案,也即顯示器;接著執行1>file
,這樣 1 就指向了 file 檔案,但是 2 依然指向顯示器。最終的結果是,正確的輸出結果輸出到了 file 檔案,錯誤資訊卻還是輸出到顯示器。echo "C語言中文網" 10>log.txt >&10
先執行10>log.txt
,開啟 log.txt,並給它分配檔案描述符 10;接著執行>&10
,用檔案描述符 10 來修改檔案描述符 1(對於>
,省略不寫的話預設為 1),讓 1 和 10 都指向 log.txt 檔案,最終的結果是向 log.txt 檔案中輸出內容。echo "C語言中文網" >log.txt
,我之所以寫得這麼繞,是為了讓大家理解各種操作符的用法。echo "C語言中文網" 10>log.txt >&10 10>&-