标准输入/出与重定向
標(biāo)準(zhǔn)輸入、輸出、錯誤
文件描述符
每個進(jìn)程會默認(rèn)打開3個文件描述符:
STDIN_FILENO:值為0,代表標(biāo)準(zhǔn)輸出流
STDOUT_FILENO:值為1,代表標(biāo)準(zhǔn)輸入流
STDERR_FILENO:值為2,代表標(biāo)準(zhǔn)錯誤流
?
設(shè)備文件
標(biāo)準(zhǔn)輸入文件:stdin,是指向鍵盤緩沖區(qū)的文件指針
標(biāo)準(zhǔn)輸出文件:stdout,是指向屏幕顯示區(qū)的文件指針
標(biāo)準(zhǔn)錯誤文件:stderr,是指向屏幕顯示區(qū)的文件指針
??通過這兩個指針封裝了鍵盤和屏幕I/O操作的底層實(shí)現(xiàn)細(xì)節(jié),從標(biāo)準(zhǔn)輸入讀取就是讀取 /dev/stdin 的文件內(nèi)容,輸出到標(biāo)準(zhǔn)輸出就是寫入 /dev/stdout 文件。但實(shí)際上 /dev/stdin 和 /dev/stdout 并不是真實(shí)的文件,而是鏈接文件,它們連接到其他文件(默認(rèn)是鍵盤緩沖區(qū)文件和屏幕緩沖區(qū)文件)。
??可以看見stdout和stderr都是指向屏幕,那為什么還要分成stdout 和 stderr 呢?這是因?yàn)橥ǔT?server 的工作環(huán)境下,幾乎所有的程序都是 run 在 background 的,所以為了方便 debug,一般在設(shè)計(jì)程序時,就把stdout 送到/存到一個檔案(即重定向),把錯誤的信息 stderr 存到不同的檔案。
?
?
重定向
??C庫提供的一些標(biāo)準(zhǔn)I/O函數(shù)操作的是文件描述符,即標(biāo)準(zhǔn)輸入流、輸出流、錯誤流,而不是鍵盤的設(shè)備文件或屏幕的設(shè)備文件。通常標(biāo)準(zhǔn)輸入流對應(yīng)著鍵盤的標(biāo)準(zhǔn)文件,標(biāo)準(zhǔn)輸出流和錯誤流對應(yīng)屏幕的標(biāo)準(zhǔn)文件,但是當(dāng)使用重定向后改變標(biāo)準(zhǔn)輸入、輸出、錯誤流對應(yīng)的文件后,這些標(biāo)準(zhǔn)I/O函數(shù)讀取的輸入或輸出的對象就不再是鍵盤或屏幕,而是重定向的文件。
Linux中的重定向符是 < 和 >,例如:
??test.sh > test.log 指令會把test.sh腳本的標(biāo)準(zhǔn)輸出重定向到文件test.log,也就是原本打印到終端的輸出內(nèi)容被打印到test.log文件中。但是,如果 test.sh 腳本中有語法錯誤或者其他,那么錯誤信息作為標(biāo)準(zhǔn)錯位仍然會被打印到終端中。
??想要把錯誤信息和標(biāo)準(zhǔn)輸出一起打印到 test.log 文件的話,需要使用 test.sh > test.log 2>&1 ,其中 2>&1 是把這個進(jìn)程中的標(biāo)準(zhǔn)錯誤重定向到標(biāo)準(zhǔn)輸出,然后就能和標(biāo)準(zhǔn)輸出一起被打印到test.log文件中。
??注意,2>&1和2>1不一樣,后者是把標(biāo)準(zhǔn)錯誤重定向到名為 1 的文件,而不是標(biāo)準(zhǔn)輸出。
?
command > file 2>file 與 command > file 2>&1 的區(qū)別
??直觀上二者的作用都是把標(biāo)準(zhǔn)錯誤和標(biāo)準(zhǔn)輸出都重定向到文件 file 中,但是實(shí)際作用有所區(qū)別。前者是把stder和stdout分別送到file中,file相當(dāng)于被打開兩次,這樣stderr和stdout的內(nèi)容會互相覆蓋,相當(dāng)于使用FD1和FD2兩個同時搶占file的管道。而后者是將stderr和stdout以同一個管道送往file,file只被打開一次。并且后者效率更高。
?
重定向到 /dev/null
??/dev/null是一個無底洞,輸入到其中的內(nèi)容會直接消失,并且它是個只讀文件。通常有不想要的垃圾信息可以扔進(jìn) /dev/null。
??>/dev/null 2>&1 的作用是把標(biāo)準(zhǔn)錯誤和標(biāo)準(zhǔn)錯誤都重定向到 /dev/null 中,沒有文件描述符時默認(rèn)是 1,即標(biāo)準(zhǔn)錯誤重定向到標(biāo)準(zhǔn)輸出,而標(biāo)準(zhǔn)輸出重定向到了 /dev/null,所以腳本執(zhí)行時不輸出任何信息到終端。
??cat /dev/null > file 的作用是清除文件 file 的內(nèi)容。
總結(jié)
以上是生活随笔為你收集整理的标准输入/出与重定向的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 备考一天速通计算机三级网络技术
- 下一篇: 【进程通信】Signal信号