Pipe
管道將其輸出發送到哪裡?
我的理解是,
pipe
例如,command1 | command2
將 的輸出發送
command1
到command2
。但是,我希望這會起作用: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 上的文件名。