標準 I/O
資料流(stream)是指使用者所輸入之資料內容與顯示於螢幕之資訊內容。
欲從哪讀入所輸入資料,又要將結果輸出至何處,則需了解連接 stream 之 device:
- 標準輸入:standard input(stdin)
預設是讓程式從鍵盤來讀取資料,其 FD 代碼為 0。
- 標準輸出:standard output(stdout)
預設是將程式執行結果輸出至螢幕,其 FD 代碼為 1。
- 標準錯誤輸出:standard error(stderr)
預設是將程式執行錯誤結果輸出至螢幕,其 FD 代碼為 2。
Note:FD(File Descriptor)是用來告訴程式要從哪裡讀入資料,又要將結果輸出至哪裡之意。
重導符號
- cmd > file :將指令的 stdout 重導至 file。同於「1>」。
- cmd >> file:將指令的 stdout 重導並附加至 file。
- cmd &> file:將指令的所有輸出(含 stdout 及 stderr)重導至 file。
- cmd >& file:同上。
- cmd > file 2>&1:將 stderr 重導至 stdout。同上兩式做法。
- cmd > file 1>&2:將 stdout 重導至 stderr。
- cmd < file :以 file 內容作為指令的 stdin。同於「0<」。
- cmd << str :當所輸入字串符合 str 時,即代表輸入結束。
範例一:cmd > file
[barry@rhel ~]$ cat /etc/passwd > barryfile
→ 當目的檔不存在,會先建立起來;已存在,則先清除目的檔內容後再寫入資料(即覆寫)。
[barry@rhel ~]$ cat
I am barry. ← 從鍵盤所做輸入。
I am barry. ← cat 讀入後,即把結果輸出至螢幕。使用 Ctrl-D 可中斷輸入。
[barry@rhel ~]$ cat > myfile please input from keyboard. Ctrl-D
[barry@rhel ~]$ cat /etc/fstab nofile 1>file1 2>file2
→ 將 stdout 訊息重導至 file1,stderr 訊息重導至 file2。
[barry@rhel ~]$ cat /etc/fstab nofile >file1 2>file2
→ 同上。
[barry@rhel ~]$ cat /etc/fstab nofile 2> /dev/null
→ /dev/null 為一輸出裝置,如同黑洞般,可把不需要之資料重導至此處丟棄。
範例二:cmd >> file
[barry@rhel ~]$ echo "hello,tina." > test1
[barry@rhel ~]$ echo "i am barry." >> test1
[barry@rhel ~]$ cat test1
範例三:cmd > file 2>&1、cmd > file 1>&2、cmd &> file
[barry@rhel ~]$ cat /etc/fstab nofile > file3 2>&1
→ 將 stderr 與 stdout 訊息重導至 file3。重導順序為 stdout 訊息優先於 stderr 訊息
[barry@rhel ~]$ cat /etc/fstab nofile &> file5
[barry@rhel ~]$ cat /etc/fstab nofile >& file5 → 將 stderr 與 stdout 訊息同時重導至 file5。
[barry@rhel ~]$ cat /etc/fstab nofile > file6 1>&2
→ 將 stderr 與 stdout 訊息輸出至螢幕(會建立起 file6 空檔案)。
範例四:cmd < file
[barry@rhel ~]$ cat < /etc/passwd
→ cat 經由 stdin 讀入/etc/passwd 檔案內容,並將結果輸出至螢幕。
[barry@rhel ~]$ cat < /etc/passwd >> file2
→ cat 經由 stdin 讀入/etc/passwd 檔案內容,並將結果重導附加輸出至 file2。
範例五:cmd << str
[barry@rhel ~]$ cat << endoff > file7 > hello,everybody.
> i am barry. > endoff
→ 當輸入完 endoff 按下 Enter 後,即代表輸入結束,此時會把剛剛所作輸入重導至 file7。
[barry@rhel ~]$ cat file7
管線(pipe line)
管線(|)的作用在於將程式的 stdout 訊息重導給另一個程式,使其從 stdin 讀入資料。
EX: cmd1 | cmd2
cmd1 的 stdout(不包括 stderr)訊息將是 cmd2 從 stdin 讀入的資料。
另 cmd2 都是一些過濾器指令(Filter command),以便對資料內容進行處理。常見之 Filter command 如 cat、tac、nl、head、tail、cut、wc、tr、sort、uniq、grep、sed、…等等。
Filter command 一般執行方式如下:
- 直接開啟檔案來讀入資料,如:head /etc/passwd
- 經由 stdin 來讀入檔案內容,如:cat < /etc/fstab
- 經由 stdin 來讀入前面指令的 stdout 訊息,如:ls –l /etc | tail –n 5
範例:
[barry@rhel ~]$ cat -n /etc/passwd | head -n 20 | tail -n 6
→ 列出檔案內容第 15 至 20 行,並附上行號。
[barry@rhel ~]$ cat /etc/passwd | cat -n | tee testfile | tac
→ tee 指令只能從 stdin 讀取資料,且可把結果同時輸出至檔案及螢幕上。
tee –a file 可避免覆寫 file 內容。
[barry@rhel ~]$ cat /etc/fstab nofile 2>&1 | nl | tac > pwfile
→ 可將 stdout 與 stderr 訊息交由 nl 從 stdin 讀入,而非只讀 stdout 訊息。
更多資料:
http://linux.vbird.org/linux_basic_train/unit08.php#8.2
https://blog.gtwang.org/linux/linux-io-input-output-redirection-operators/
留言列表