首先我們先回顧下bash現有的重定向符號
1.重定向輸入輸出,目標是文件word
[n]<word 默認n為0
[n]>word 默認n為1
[n]>|word 默認n為1 noclobber選項有關,直接例子就明白它的用處了
[n]》word 默認n為1
igi@igi-debian:~$ rm -f testfile
igi@igi-debian:~$ touch testfile
igi@igi-debian:~$ cat testfile
igi@igi-debian:~$ set -o noclobber
igi@igi-debian:~$ echo 2 >testfile
bash: testfile: cannot overwrite existing file
igi@igi-debian:~$ echo 2 >| testfile
igi@igi-debian:~$ cat testfile
2
2.重定向標准錯誤和標准輸出到指定文件描述符
&>word 更通用
>&word
>word 2>&1
追加輸出
&》word 沒有》&word的表達方法
》word 2>&1
3.Here Documents
《[-]word
here-document
delimiter
-符號將刪除所有行開頭的tab符
4.Here Strings
<<<word
5.復制文件描述符
[n]<&word 默認n為0,如果為數字,必須得為打開的文件描述符
[n]<&- 關閉文件描述符
[n]>&word 默認n為1,如果為數字,必須得為打開的文件描述符
[n]>&- 關閉文件描述符
6.移動文件描述符
[n]<&digit- 默認n為0
[n]>&digit- 默認n為1
7.以讀寫方式打開文件描述符
[n]<>word 文件不在時會被創建
如果要深刻理解重定向,先要明白以下2點
1.shell(bash或者csh等)負責重定向,對於程序或者函數,這一切都是透明的,它只管輸入輸出,至於從哪輸入哪輸出,是shell解釋器負責
2.shell命令解析過程中,在實際執行命令前,IO重定向先設置好
我們來看以下的例子
1.'echo 1 a1 >a2′ 與 'echo 1 >a2 a1′
igi@igi-debian:~$ echo 1 a1 >a2
igi@igi-debian:~$ cat a2
1 a1
igi@igi-debian:~$ rm a2
igi@igi-debian:~$ echo 1 >a2 a1
igi@igi-debian:~$ cat a2
1 a1
IO重定向是在命令執行前設置好,所以上面兩種情況,最後的效果一樣,bash先把輸出重定向到a2文件,再執行'echo 1 a1′
2.'ls nothisfile >res 2>&1′ 與 'ls nothisfile 2>&1 >res'
igi@igi-debian:~/rtest$ ls nothisfile
ls: cannot access nothisfile: No such file or directory
igi@igi-debian:~/rtest$ ls nothisfile >res 2>&1
igi@igi-debian:~/rtest$ cat res
ls: cannot access nothisfile: No such file or directory