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