2016-01-31 62 views
16

工作當我運行以下Bash劇本,我希望它打印Hello。相反,它會打印一個空白行並退出。管道無法與echo命令

echo 'Hello' | echo 

爲什麼不piping輸出echoecho工作?

+2

您似乎期待第二個'echo'的行爲像'貓'。 –

回答

25

echo打印它的所有參數。它不從stdin讀取。因此,第二個echo打印它的所有參數(無),然後退出,無視stdinHello

一個程序,讀取其stdin,並打印到stdout,使用cat

$ echo Hello | cat 
Hello 
+1

或'$回聲你好| xargs echo'相當於'echo Hello | xargs'默認。 – daGo

2

這是因爲echo(包括內置和/bin/echo)不讀stdin什麼。

使用cat代替:

echo 'Hello' | cat 
Hello 

或者沒有管:

cat <<< 'Hello' 
3

管道只能做採取輸入從標準輸入命令。但回聲不會從標準輸入。它會從參數中得到輸入並打印出來。所以這不會工作。序呼應,你可以這樣做echo $(echo 'hello')

8

你似乎並不明白管道。在這種情況下,它們更準確地稱爲匿名管道,因爲他們沒有名字(也有命名管道)。匿名管道只能在相關進程之間運行,例如具有相同父進程的進程。

管道是由C運行時庫產生的IO系統的一部分。這些被默認緩衝(有一個例外)。基本上,管道只是將一個進程的輸出緩衝區連接到另一個進程的輸入緩衝區。

使用的第一三個流(稱爲文件描述符)編號爲0,1和2。第一,0,被稱爲標準輸入,或stdin(在C中使用的名稱)。默認情況下,它連接到鍵盤,但可以使用<符號或位於管道右側的程序名重定向。

第二個1被稱爲標準輸出stdout。默認情況下,它連接到終端屏幕,但可以使用>符號或位於管道左側的程序名稱重定向。

所以:

echo 'Hello' | echo 

需要從echo標準輸出並將其傳遞到的echo標準輸入。但echo不讀取標準輸入!所以沒有任何反應

過濾程序過程在命令行中指定的文件名。如果沒有給出文件名,那麼他們讀取標準輸入。例子包括catgrep,並sed,但echo。例如:

echo 'Hello' | cat 

將顯示 '你好',並且cat是無用的(它經常是)。

echo 'Hello' | cat file1 

echo忽略輸出和只顯示文件1的內容。請記住,如果沒有文件名是因爲標準輸入是隻讀的。

你怎麼看這個顯示器?

echo 'Hello' | cat < file1 file2 

爲什麼?

最後,第三個流,如圖2所示,被稱爲標準誤差,或stderr,而這一次是無緩衝。它是由管道忽略,因爲它們只stdin和stdout之間操作。但是,您可以重定向錯誤輸出到標準輸出使用(見man dup2):

myprog 2>&1 | anotherprog 

2>&1意味着「重定向文件描述符2到同一個地方FIE描述1」。

上面是正常的行爲,但是如果程序可以覆蓋所有需要的行爲,例如,它可以從文件描述符2中讀取。我省略了很多其他的細節,包括其他形式的重定向,如進程替換這裏的文件