了解 Command 的輸入與輸出方式,如何傳遞 Command 的結果給下個 Command,可以讓你真正感受到 Shell 的強大,廢話不多說就馬上開始吧!
Command 的 Input 和 Output
給 Command輸入的資料可以是 Standard Input 或者是參數, Command 執行完的結果是 Standard Output 或是Standard Error,Standard Output 和 Error 預設的輸出位置是 Terminal
Standard Input: 預設是鍵盤輸入
我們用 cat
command 舉例,我們先查看 cat
指令的 man page
說明寫著,如果沒有給 file 參數的話,就會從 standard input 讀取
我們試試看只給 cat
command 不給參數後,我們就可以打字用 input 給 cat
Rediretion
將 Standard Iput, Out, Error 的 data stream 轉向非 terminal 的地方
每個 data stream 都有其代表的數字
- standard input: 0
- standard output: 1
- standard error: 2
Example
Standard Output 範例:cat 1> output.txt
裡的 1 就代表 standard output, >
代表輸出的位置,也可以省略 1 cat > output.txt
如果你已經有 output.txt 檔了,Linux 會其清空檔案後再輸入,術語叫 truncation,如果你不想要原本檔案的資料被清空,則可以用 cat >> output.txt
, >>
為 appending 的符號
Standard Error 範例: cat -k bla 2> error.txt
Standard Output 和 Error 都輸出: cat 1> output.txt 2>error.txt
Standard Input: 我們讀取一個檔案的資料當作 standard input, cat 0< inpput.txt
或是 cat < inpput.txt
練習: 利用 cat
command 讀取某個檔案的內容後寫入 hello.txt
答案: cat < input.txt > hello.txt
Piping
利用 |
符號可以將 command 的 standard output 轉為下個 command 的 standard input,並且可以不斷接下去
語法: command1 [-options] [args] | command2 [-options] [args] | ...
Q: 如果我們現在希望將 date
指令的第一個欄位的值,該怎麼做呢?
利用 redirection:
- 將
date
指令的 output 存在 date.txt:date > date.txt
cut
指令讀取 date.txt 後再取第一個欄位:cut < date.txt -d " " -f 1
利用 Piping:
- 將
date
的 standard output 轉為cut
standard input 然後執行:date | cut -d " " -f 1
tee 指令
當我們希望指令的輸出可以同時產生檔案跟變為下個指令的輸入時,我們可以利用 tee
指令,tee
指令就像多了一個出口的水管
Q: 如果我們想 date
將完整的日期寫入 full_date.txt 同時取得 date
輸出的第一個欄位,指令該怎麼寫?
A: date | tee full_date.txt | cut -d " " -f 1
xargs
某些指令不接受 standard input,只接受 command args, 像是 echo
指令,但我們可以使用 xargs
來接前面指令 piping 過來的 standard input 轉換成 command args,給 echo
指令當參數
ex: date | xargs echo