2011-04-27 59 views
8

任何人都可以告訴我區別嗎?例如:
如果我有一個文件a.txt,內容如下:在linux中流水線和重定向的區別

一個
b
Ç

這將是對我來說cat a.txt | catcat < a.txt
之間的區別他們都模擬STDIN,這是正確的,還是有區別?非常感謝。

+2

投票轉移到超級用戶,這不是一個編程問題。 – unwind 2011-04-27 10:54:23

+1

@unwind呃..是的。 Bash是一種編程語言。這是編程 - 高水平。 – 2011-06-17 20:18:10

+2

這裏存在的問題(它更適合):http://askubuntu.com/questions/172982/what-is-the-difference-between-redirection-and-pipe – 2014-05-16 04:37:30

回答

11

管道從一個過程工作到另一個過程(第一個示例中的cat s),因此需要兩個過程合作。重定向由shell本身處理。在shell中執行這些操作時可能很重要,例如working with variables

+0

這很好,謝謝。 – user685275 2011-04-28 11:08:33

3

重定向不會「模擬STDIN」。當您重定向時,文件該進程的標準輸入。特別是,如果輸入是常規文件,比許多程序是管道或tty,許多程序具有不同的行爲,因此您可能會得到不同的行爲。例如:

 
$ < file perl -E 'say "is a regular file" if -f STDIN' 
is a regular file 
$ cat file | perl -E 'say "is a regular file" if -f STDIN' 
+0

對不起,我是新手,是否可以解釋一下您的示例程序,謝謝。 – user685275 2011-04-27 15:47:11

+1

@ user685275該程序只檢查其輸入流(stdin)是否爲常規文件。如果是,則打印「是常規文件」。如果沒有,它什麼都不做。從文件重定向時,該文件是該程序的輸入流。當從另一個進程管道傳輸時,管道的讀取端是輸入流。當你沒有管道或從tty重定向運行時,tty是輸入流。 – 2011-04-27 17:10:43

+0

感謝您的回答,非常感謝。 – user685275 2011-04-28 11:08:14

1

首先,兩個結果是相同的。沒什麼可說的。

對於cat a.txt | cat的工作原理,第一隻貓參數a.txt,然後打印其內容。你管第一個的stdout到第二個的stdin。第二個cat找不到任何參數,因此它從stdin中讀取內容,並將其打印出來。

因爲你在第二個命令使用<,系統取代的catstdina.txt文件流。其他情況與第一種情況下的第二隻貓相同。

相關問題