How to Use the Stdin, Stderr, and Stdout Streams in Bash
目錄
原文
How to Use the Stdin, Stderr, and Stdout Streams in Bash – Linux Consultant
引言
當Linux作業系統啟動時,將會有三個流被開啟。它們是stdin、stdout和stderr。
stdin 的全稱是標準輸入,用於接受使用者的輸入。
stdout 的完整形式是標準輸出,用於將命令的輸出儲存到stdout流中。
stderr 的完整形式是標準錯誤,用於將任何命令產生的錯誤資訊儲存到資料流中。
stdin、stdout 和 stderr 的相應數字識別符號值為0、1和2。
Redirection Operators of Stdin, Stdout, and Stderr
Stdin、Stdout和Stderr的重定向運算子
重定向符號使用:
- "<" 或 "0<"用於stdin流。
- ">" 或 "1>"用於stdout流。
- "2"用於stderr流。
Uses of Stdin, Stdout, and Stderr
下面是一些使用stdin,stdout,stderr的使用案例。
取出檔案的內容並在終端列印的方法在這個例子中顯示。
Example 1: Use of Stdin
>、>>、< 等運算子使用
執行下面的 "cat "命令,建立一個名為testdata.txt的帶有一些內容的文字檔案。
$ cat > testdata.txt
注意輸入上面的命令之後,此時shell會等待輸入流進行輸入,此時可以再控制檯隨意輸入一些字元,之後按鍵ctrl + c**的方式結束輸入,此時ls
當前可以看到會出現新檔案 testdata.txt。
注意如果我們重複執行此命令,那麼每次新的輸入都會 覆蓋掉舊的輸入。
ubuntu@VM-8-8-ubuntu:~$ cat > testdata.txt
abcdefg
^C
ubuntu@VM-8-8-ubuntu:~$ cat testdata.txt
abcdefg
執行下面的 "cat "命令,將一些內容追加到testdata.txt檔案中。
$ cat >> testdata.txt
下面是實踐程式碼:
ubuntu@VM-8-8-ubuntu:~$ cat testdata.txt
abcdefg
ubuntu@VM-8-8-ubuntu:~$ cat >> testdata.txt
hijklmn
^C
ubuntu@VM-8-8-ubuntu:~$ cat testdata.txt
abcdefg
hijklmn
執行下面的 "cat "命令,從testdata.txt檔案中獲取一個輸入流,並將其列印到終端。
$ cat < testdata.txt
從表面效果上來看此命令實際上只是執行了<
符號前面的命令而已。但是在後續的案例中,將會介紹如何讀入輸入流重定向到另一個輸出流:
ubuntu@VM-8-8-ubuntu:~$ ls < testdata.txt
testdata2.txt testdata.txt
ubuntu@VM-8-8-ubuntu:~$ ls -l < testdata.txt
total 8
-rw-rw-r-- 1 ubuntu ubuntu 23 Mar 14 13:06 testdata2.txt
-rw-rw-r-- 1 ubuntu ubuntu 16 Mar 14 13:13 testdata.txt
Output:
The following output appears after executing the previous commands after adding the string, “linuxhint.com”, and “Scripting Language” into the testdata.txt file:
輸出:
在英文原文的案例中,在testdata.txt檔案中加入 "linuxhint.com "和 "指令碼語言 "這兩個字串後,執行前面的命令會出現以下輸出。
The method of creating a file using pipe (|) and redirection operator is shown in this example.
除了上面幾種方法外,還可以使用管道(|)和重定向運算子建立檔案。
Example 2: Use of Stdout
pipe (|) 管道符和stdout
下面是一個使用管道符重定向輸出並且建立檔案的例子。
Run the following command to write a string data into the text file named testdata2.txt by piping. The output of the “echo” command is sent to the input of the “cat” command using the pipe (|) operator:
透過下面的命令,把echo的命令傳送到cat當中,最後重定向輸出流到檔案testdata2.txt。
ubuntu@VM-8-8-ubuntu:~$ echo "Learn Bash Programming" | cat > testdata2.txt
ubuntu@VM-8-8-ubuntu:~$ ls
testdata2.txt
Run the following “cat” command to check the content of the testdata2.txt file:
再次執行 "cat "命令檢查testdata2.txt檔案的內容。
ubuntu@VM-8-8-ubuntu:~$ cat testdata2.txt
Learn Bash Programming
Output:
The following output appears after executing the previous commands. According to the output, the output of the “echo” command is written into the testdata2.txt file:
輸出:
下面的例子可以可以看到echo的輸出內容被重定向寫入到testdata2.txt 這個檔案當中,下面是合併兩個命令的輸出結果:
ubuntu@VM-8-8-ubuntu:~$ echo "Learn Bash Programming" | cat > testdata2.txt
ubuntu@VM-8-8-ubuntu:~$ ls
testdata2.txt
ubuntu@VM-8-8-ubuntu:~$ cat testdata2.txt
Learn Bash Programming
Run the following command to write the output of the “ls –l” command into a text file named list.txt using the redirection operator (‘>’):
執行以下命令,使用重定向運算子('>
')將 ls -l
命令的輸出寫入一個名為list.txt的文字檔案中。
ls -l > list.txt
個人的實驗結果如下:
ubuntu@VM-8-8-ubuntu:~$ ls -l > list.txt
ubuntu@VM-8-8-ubuntu:~$ cat list.txt
total 8
-rw-rw-r-- 1 ubuntu ubuntu 0 Mar 14 13:18 list2.txt
-rw-rw-r-- 1 ubuntu ubuntu 0 Mar 14 13:22 list.txt
-rw-rw-r-- 1 ubuntu ubuntu 23 Mar 14 13:06 testdata2.txt
-rw-rw-r-- 1 ubuntu ubuntu 16 Mar 14 13:13 testdata.txt
Example 3: Use of Stdin and Stdout
The method of using both stdin and stdout to take an input from a file and write it into a file is shown in this example.
這部分介紹瞭如何同時使用stdin和stdout。
Run the following “cat” command to take the content of the testdata.txt file and write it into the testfile.txt file and the terminal:
下面的cat命令可以把testdata.txt檔案的內容列印到控制檯,同時重定向輸出流寫入檔案到另一個檔案:
ubuntu@VM-8-8-ubuntu:~$ cat < testdata.txt > otherfile.txt
ubuntu@VM-8-8-ubuntu:~$ cat testdata.txt
abcdefg
hijklmn
ubuntu@VM-8-8-ubuntu:~$ cat otherfile.txt
abcdefg
hijklmn
PS:為了方便理解,建議讀者把上面的命令分為兩個操作,類似這樣的寫法:( cat < testdata.txt ) > otherfile.txt
。
上面的命令可以看作兩個部分,第一部分是讀取testdata.txt的內容作為輸入流,然後輸出再輸出到 otherfile.txt。最終兩個檔案內容是一樣的,這個操作的命令效果和CP複製一個檔案的效果類似:
ubuntu@VM-8-8-ubuntu:~$ cp otherfile.txt otherfile2.txt
Example 4: Use of Stderr
The content of the standard error can be printed in the terminal or redirected into a file or sent to the /dev/null that works like the recycle bin. The different ways to pass the standard error are shown in this example
stderr是標準錯誤資訊,通常的做法是輸出到控制檯或者輸出到檔案,還有一種方式是丟棄到/dev/null這個“黑洞”當中,下面的例子是stderr的用法案例:
下面的命令是正確的,它用換行符列印了 "Hello "字串。所以下面的命令沒有產生標準錯誤。
ubuntu@VM-8-8-ubuntu:~$ printf "%s\n" "Hello"
Hello
我們可以透過 echo $?
的方式,檢查上一個命令是否正確:
ubuntu@VM-8-8-ubuntu:~$ echo $?
0
下面的命令是錯誤的,因為沒有名為 "pirntf
"的命令。所以它產生了一個標準錯誤,並且錯誤被列印控制檯。
ubuntu@VM-8-8-ubuntu:~$ pirntf "%s\n" "Hello"
Command 'pirntf' not found, did you mean:
command 'printf' from deb coreutils (8.32-4.1ubuntu1)
Try: sudo apt install <deb name>
這時候檢查上一個命令是否正確會,結果返回一個非0值代表上一條命令有誤:
ubuntu@VM-8-8-ubuntu:~$ echo $?
127
Sometimes, it requires printing the custom error by hiding the standard error to make the error more understandable for the users. This task can be done by redirecting the error into the /dev/null. The “2>” is used here to redirect the error into /dev/null.
有時,控制檯需要透過隱藏標準錯誤來列印自定義錯誤,使使用者更容易理解錯誤,這個任務可以透過將錯誤重定向到/dev/null
中來完成。這裡使用 "2>
"來重定向錯誤到/dev/null
。
ubuntu@VM-8-8-ubuntu:~$ pirntf "%s\n" "Hello" 2> /dev/null
ubuntu@VM-8-8-ubuntu:~$ echo $?
127
Sometimes, the standard error requires storing into a file for future use. This task can be done by redirecting the error into a file using the “2>” operator.
有時,標準錯誤需要儲存到一個檔案中提供給以後使用(日誌備份)。這項任務同樣可以透過使用 "2>"運算子將錯誤重定向到一個檔案中來完成。
ubuntu@VM-8-8-ubuntu:~$ pirntf "%s\n" "Hello" 2> error.txt
ubuntu@VM-8-8-ubuntu:~$ cat error.txt
Command 'pirntf' not found, did you mean:
command 'printf' from deb coreutils (8.32-4.1ubuntu1)
Try: sudo apt install <deb name>
從結果可以看到在執行命令後標準錯誤被正確寫入error.txt檔案。
總結
The uses of stdin, stdout, and stderr are explained in this tutorial using multiple examples that will help the Linux users to understand the concept of these streams and use them properly when required.
本教程用多個例子解釋了stdin、stdout和stderr的用途,這將有助於Linux使用者理解這些流的概念,並在需要時正確使用它們。