1、將標準輸出(stdout)和標準錯誤輸出(stderr)分別重定向到兩個不同的文件
其中符號'>'默認將標準輸出重定向,意思和'1>'相同,‘2>'表示重定向標準錯誤輸出,數字1和2其實是文件描述符,在linux下默認1為標準輸出STDOUT,2為標準錯誤輸出STDERR
2、將標準輸出和標準錯誤輸出重定向到同一個文件中,共有下圖所示三種寫法,后兩種寫法可以認為符號&是作為特殊標記了,第一種寫法則可以看做先將STDOUT輸出到both文件,“2>&1”則可將1理解為標準輸出重定向的文件,然后“2>&1”相當于一個賦值操作,將文件描述符2指向的文件賦值為文件描述符1指向的文件
3、重定向符'>'默認會將目標文件清空(如果存在的話),然后添加重定向的內容。如果需要在目標文件的末尾進行添加,則需要使用">>"重定向符,如下所示
4、/dev/null是Unix/Linux系統中一個特殊的設備,它并不是真正的設備,所有你認為沒用的數據都可以重定向到它,并且不會占據任何磁盤空間,如下圖就將錯誤信息扔進了/dev/null中
5、將多個命令的輸出重定向到同一個文件有以下兩種方式,但是基于的原理是完全不同的,花括號那組其實只是將括號中命令的輸出集中重定向而已,但是普通括號內的命令是在子shell,也就是subshell中運行的。這時我們就會發現,因為cd指令的存在,第一條命令運行后我們仍在之前的目錄(因為subshell中位置的改變與父shell無關),但是第二條指令運行之后,我們就在上級目錄了
6、將一個程序的輸出作為另一個程序的輸入,最常見的如下圖所示,但是需要注意的是,這兩個程序是運行在不同的subshell中的!
7、將管道中的數據流備份:使用如下所示是tee命令,它將數據量輸入下一級管道的同時,將它們備份到tee.file文件中
8、將數據重定向到多個文件中,如下圖所示,其實本質上就是將寫入不同文件描述符的數據重定向到不同的文件中,這樣的話,在程序中可以不事先打開文件,而直接向文件描述符寫數據,例如:write(3,buf,255),就是直接向文件描述符3寫數據,而我事先并沒有打開文件的操作
9、如果沒有使用特殊的手法,例如將STDERR重定向至STDOUT或者在程序中就進行重定向,那么管道只重定向STDOUT,我們沒有辦法只重定向STDERR而不重定向STDOUT
10、交換STDOUT和STDERR:如果你想要將STDOUT輸出到stdout.logfile中,并且通過tee將STDERR即輸出到屏幕又輸出到stderr.logfile。這時就需要使用下圖所示的方法。其實本質上就是交換了STDOUT和STDERR。類似于兩個整數的交換。首先將描述符3賦值為1,即STDOUT,再將標準輸出的內容輸出到stdout.logfile中,最后"2>&3"表示將標準錯誤的數據往標準輸出中寫,因為此時描述符3的值就是標準輸出,這樣標準錯誤的內容就能通過標準輸出通過管道了
11、我們知道重定向符號'>'會覆蓋目標文件中的內容,那么為了防止誤操作導致重定向覆蓋了我們原先不想被覆蓋的文件,我們可以采用如下的方法,如果要恢復默認設置,使用“set +o noclobber”,如果在已經設置了noclobber的情況下,仍然強行做一次重定向覆蓋操作,則可使用類似“echo do it >| my.file”的方法,“>|”表示強行重定向覆蓋操作
參考文獻:《bash Cookbook》,Carl Albing
新聞熱點
疑難解答