Pipe

管道將其輸出發送到哪裡?

  • November 25, 2018

我的理解是,pipe例如,

command1 | command2 

將 的輸出發送command1command2。但是,我希望這會起作用:

echo "tmp.pdf" | evince 

但事實並非如此。發送的輸出在哪裡echo "tmp.pdf"

管道將其輸出發送到打開以供讀取的程序。在 shell 管道中,這是管道符號右側的程序,即evince在您的範例中。

您正在將文件名發送tmp.pdf到其標準輸入上的 evince。然而 evince 並不關心它的標準輸入。就像每個作用於文件的程序一樣,它希望文件名作為命令行參數傳遞;如果您不在命令行上傳遞文件名,它會提供打開文件。命令行參數與標準輸入不同。人類有不同的輸入器官來輸入不同的東西(例如你不能通過鼻子吃東西),同樣的程序也有不同的方式來接收用於不同目的的資訊。

Evince 可以在標準輸入上讀取文件(不是文件名):evince /dev/stdin <"tmp.pdf". (這可能不適用於所有 Unix 變體。)文件名的/dev/stdin意思是“您已經在標準輸入上打開的任何文件”。用於命令行的程序通常在沒有文件名的情況下讀取其標準輸入,但 GUI 程序通常不會。Evince 只能以這種方式打開正常文件,而不是來自管道的數據(例如cat tmp.pdf | evince /dev/stdin,不起作用),因為它需要能夠在頁面之間導航時在文件中來回查找。

你的理解是正確的。該序列command1 | command2將 的輸出 (STDOUT) 發送command1到 的輸入 (STDIN) command2。您的evince命令不起作用的原因是它evince不接受 STDIN 上的文件名。

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