理解 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

更新於:2021年7月31日

23K+ 瀏覽量

開啟你的 職業生涯

透過完成課程獲得認證

開始學習
廣告