iT邦幫忙

2023 iThome 鐵人賽

DAY 14
0

管線應用

管線(或管道)應用在 Linux 中是匿名管道的其中一種,屬於單向流。我們可以把每個程式的訊息輸出視為水流,使用水管把這些水流導到另一個程式,這就是管線的概念。

從先前的練習中我們已經知道每個行程都會有 stdin、stdout 與 stderr 等訊息輸入與輸出流,而每個行程的 stdin 可以是前一個行程的輸出,這個輸出必須是 stdout 才行。

若要把行程的 stdout 交給另一程式的 stdin 做後續處理,那麼我們可以使用管導 (PIPE) 符號 | 進行連接,如下圖所示。

將 STDOUT 透過 pipe 導到下一程式

管線流向

我們使用 ls -l 檢視 sample 檔案後,透過 | 傳給 grep 找出 sample 字串:

student$ ls -lh sample | grep sample --color
-rw-r--r-- 1 student student 1.8K Aug 25 16:44 sample

在上面的輸出中,我們會看到 sample 字串有紅色字樣,這個紅色字樣是由 grep 所套用。

透過下列的方式,我們刻意列出不存在的 sample2 進行測試,再看看是否能被 grep 接收到:

student$ ls -lh sample2 | grep sample --color
ls: cannot access sample2: No such file or directory

在上面的輸出結果中可以看到沒有任何字串有紅色字樣,代表這個訊息沒有流到 grep 中。

從上面的輸出我們得到幾個重點:

  • 只有 stdout 的訊息才能透過 PIPE 流到另一個程式。
  • 如果發生了 stderr 的情況時,那麼整個流程會停在有問題的階段,不會再繼續處理。

若我們需要把 stderr 的訊息也透過 pipe 傳到下一行程的話,可以使用下列方法:

student$ ls -lh sample2 2>&1 | grep sample --color
ls: cannot access sample2: No such file or directory

透過如訊息重導的技巧,就可以把原本流到 stderr 的方向全部轉到 stdout,此時就可以看到 sample2sample 字被套入紅色字樣。


上一篇
Day 13: 實做訊息重導
下一篇
Day 15: 行程運作與硬體資源
系列文
Linux 升華:初學者的探索到專家的洞察30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言