close

標準 I/O

image

 

資料流(stream)是指使用者所輸入之資料內容與顯示於螢幕之資訊內容。

欲從哪讀入所輸入資料,又要將結果輸出至何處,則需了解連接 stream 之 device:

 

  • 標準輸入:standard input(stdin)

預設是讓程式從鍵盤來讀取資料,其 FD 代碼為 0。

  • 標準輸出:standard output(stdout)

預設是將程式執行結果輸出至螢幕,其 FD 代碼為 1。

  • 標準錯誤輸出:standard error(stderr)

預設是將程式執行錯誤結果輸出至螢幕,其 FD 代碼為 2。

 

Note:FD(File Descriptor)是用來告訴程式要從哪裡讀入資料,又要將結果輸出至哪裡之意。


重導符號

  1.  cmd > file :將指令的 stdout 重導至 file。同於「1>」。
  2.  cmd >> file:將指令的 stdout 重導並附加至 file。
  3.  cmd &> file:將指令的所有輸出(含 stdout 及 stderr)重導至 file。
  4.  cmd >& file:同上。
  5.  cmd > file 2>&1:將 stderr 重導至 stdout。同上兩式做法。
  6.  cmd > file 1>&2:將 stdout 重導至 stderr。
  7.  cmd < file :以 file 內容作為指令的 stdin。同於「0<」。
  8.  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)

image

管線(|)的作用在於將程式的 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/

arrow
arrow
    創作者介紹
    創作者 STORY 的頭像
    STORY

    STORY

    STORY 發表在 痞客邦 留言(0) 人氣()