理解 Linux 中的 stdin、stderr 和 stdout
如果您使用過 Linux 作業系統,那麼很有可能遇到過三個著名的資料流,即 **stdin**、**stderr** 和 **stdout**。它們的功能各不相同,用途也各異,但它們之間有一個共同點,那就是它們都是 bash 建立的資料流。
讓我們進一步瞭解資料流的實際含義以及它們如何發揮作用。在計算領域,資料流是指能夠將資料從源頭傳輸到輸出端,反之亦然的一種機制。源頭和輸出端是資料流的兩個端點。您可能會覺得有趣的是,您在 Linux 終端中執行的任何命令都將位於這兩個端點之一。
現在我們對資料流有了一定的瞭解,讓我們進一步瞭解這三個著名的資料流。
**stdin** - 它代表標準輸入,用於接收文字作為輸入。
**stdout** - 它代表標準輸出,用於儲存您在終端中鍵入的任何命令的文字輸出,然後該輸出將儲存在 **stdout** 流中。
**stderr** - 它代表標準錯誤。當命令遇到錯誤時,就會呼叫它,然後錯誤訊息將儲存在此資料流中。
需要注意的是,在 Linux 中,所有這些流都被視為檔案。此外,Linux 為每個資料流分配了唯一的值。
0 = stdin
1 = stdout
2 = stderr
現在讓我們考慮幾個關於這三個資料流的例子。
以下示例描述了一個典型的 **stdin** 流。
命令
read
輸出
mmukul@192 Docs-Linux % read This is to stdin
在上面的命令中,我們向流提供輸入,而 read 工具從 stdin 獲取輸入。
現在,以下顯示了 stdout 的一個示例:
命令
ls -ltr
輸出
immukul@192 Downloads % ls -ltr total 1085456 drwxr-xr-x@ 13 immukul staff 416 Dec 7 2019 source-code-pro-release -rw-r--r--@ 1 immukul staff 350337 Dec 22 2019 messi.jpg -rw-r--r--@ 1 immukul staff 5953321 Dec 22 2019 927225.png -rw-r--r--@ 1 immukul staff 601852 Dec 22 2019 238870.jpg . . .
我們知道,我們使用帶 **-ltr** 標記的 ls 命令以某種排序方式列出所有檔案,其中最後更新的檔案顯示在底部。該列表被髮送到 **stdout** 資料流,然後終端將其打印出來。
現在,以下顯示了 **stderr** 的一個示例:
命令
ls -ltr printit
以上命令無效,因為我沒有名為 **printit** 的目錄,它將生成一條錯誤訊息,該訊息將傳送到 **stderr**,然後終端將其打印出來。
輸出
immukul@192 Downloads % ls -ltr printit ls: printit: No such file or directory