Linux

管道輸出以什麼格式從一個命令/程序發送和接收到另一個?

  • September 23, 2018

當一個命令以什麼方式或以什麼格式傳送到另一個命令時,管道輸出存在/被發送?是臨時文件嗎?它是一個字元串嗎?接收管道輸出的命令如何解碼/讀取該輸出?


例子:

echo "Someone string" | ./program | tail

程序“ program”是否接收echo作為文件的輸出?程序將如何讀取該輸入?

管道是一種重定向形式(將標準輸出傳輸到其他目的地),在 Linux 和其他類 Unix 作業系統中用於將一個命令/程序/程序的輸出發送到另一個命令/程序/程序以進行進一步處理. Unix/Linux 系統允許一個命令的標準輸出連接到另一個命令的標準輸入。您可以通過使用管道字元“|”來實現。

管道用於組合兩個或多個命令,其中一個命令的輸出充當另一個命令的輸入,該命令輸出可以充當下一個命令的輸入,依此類推。它也可以被視為兩個或多個命令/程序/程序之間的臨時連接。進行進一步處理的命令行程序稱為過濾器。

命令/程序/程序之間的這種直接連接允許它們同時執行,並允許數據在它們之間連續傳輸,而不必通過臨時文本文件或通過顯示屏傳遞。管道是單向的,即數據從左到右通過管道流動。

句法 :

command_1 | command_2 | command_3 | .... | command_N 

範例:列出所有文件和目錄並將其作為更多命令的輸入。

$ ls -l | more 

more命令將輸出ls -l作為其輸入。此命令的最終效果ls -l是一次顯示一個螢幕的輸出。管道充當容器,接收輸出ls -l並將其more作為輸入。該命令不使用磁碟將標準輸出連接ls -l到標準輸入,more因為管道是在主記憶體中實現的。在 I/O 重定向運算符方面,上述命令等價於以下命令序列。

$ ls -l -> temp
more -> temp (or more temp)
[contents of temp]
rm temp

更多1 , 2 , 3

./program接收echo作為文件的輸出,即標準流文件/dev/stdin。展示:

echo foo | wc -c
echo foo | wc -c /dev/stdin

輸出:

4
4 /dev/stdin

注意:流文件與儲存在磁碟上的文件有些不同。我們可以在正常文件中隨機訪問數據,但不能在文件中訪問。這就像 CD 播放器和收音機播放歌曲之間的區別。在 CD 播放器上,我們可以倒帶、快進、查找和跳過歌曲。收音機只是輸出(或流式傳輸)廣播公司現在正在發送的任何內容。

流儲存在哪裡?作業系統將其儲存在臨時數據緩衝區中,其大小因作業系統而異。請參閱管道緩衝區有多大?


在較低級別上,作業系統使用文件描述符,而不是文件名。文件描述符只是一堆數字,每個程序標識符都有自己的堆棧。Linux 還允許通過這種方式訪問/dev/stdin流(始終是文件描述符*“0”*):

echo foo | wc -c /proc/self/fd/0

輸出:

4 /proc/self/fd/0

realpath使用util可以看到另外一種 Linux 抽象:

realpath /dev/stdin /proc/self/fd/0

輸出(在我係統的目前終端上):

/dev/pts/2
/dev/pts/2

這些字母pts代表P seudo Terminal s最後一個2數字在終端之間總是不同的,因此它不是一個可靠的名稱,但這些數字可用於以下技巧:如何在不創建任何新管道或文件的情況下將輸出從一個終端發送到另一個終端

引用自:https://unix.stackexchange.com/questions/470843