回答
echo
打印它的所有參數。它不從stdin
讀取。因此,第二個echo
打印它的所有參數(無),然後退出,無視stdin
的Hello
。
一個程序,讀取其stdin
,並打印到stdout
,使用cat
:
$ echo Hello | cat
Hello
或'$回聲你好| xargs echo'相當於'echo Hello | xargs'默認。 – daGo
這是因爲echo
(包括內置和/bin/echo
)不讀stdin
什麼。
使用cat
代替:
echo 'Hello' | cat
Hello
或者沒有管:
cat <<< 'Hello'
管道只能做採取輸入從標準輸入命令。但回聲不會從標準輸入。它會從參數中得到輸入並打印出來。所以這不會工作。序呼應,你可以這樣做echo $(echo 'hello')
你似乎並不明白管道。在這種情況下,它們更準確地稱爲匿名管道,因爲他們沒有名字(也有命名管道)。匿名管道只能在相關進程之間運行,例如具有相同父進程的進程。
管道是由C運行時庫產生的IO系統的一部分。這些流被默認緩衝(有一個例外)。基本上,管道只是將一個進程的輸出緩衝區連接到另一個進程的輸入緩衝區。
使用的第一三個流(稱爲文件描述符)編號爲0,1和2。第一,0,被稱爲標準輸入,或stdin
(在C中使用的名稱)。默認情況下,它連接到鍵盤,但可以使用<
符號或位於管道右側的程序名重定向。
第二個1被稱爲標準輸出或stdout
。默認情況下,它連接到終端屏幕,但可以使用>
符號或位於管道左側的程序名稱重定向。
所以:
echo 'Hello' | echo
需要從echo
標準輸出並將其傳遞到的echo
標準輸入。但echo
不讀取標準輸入!所以沒有任何反應
過濾程序過程在命令行中指定的文件名。如果沒有給出文件名,那麼他們讀取標準輸入。例子包括cat
,grep
,並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中讀取。我省略了很多其他的細節,包括其他形式的重定向,如進程替換和這裏的文件。
- 1. 無限讀取(2)與管道命令
- 2. Linux命令行與Linux命令管道
- 3. 管道命令與sudo
- 4. Linux命令 - 管道命令
- 5. 無法繼續「$ echo prog1/p *」。命令
- 6. Emacs python echo命令與elpy
- 7. 管道參數:echo「value1 value2」|命令$ 1 $ 2
- 8. 管道unix命令
- 9. 管道命令行
- 10. 管道rm命令
- 11. tee命令無法正常運行(與讀取和echo)
- 12. 螞蟻運行命令與管道
- 13. 使用管道與查找命令
- 14. Python執行命令與管道控制
- 15. 斯卡拉 - 與管道的shell命令
- 16. 發送管道命令與pxssh/pexpect
- 17. 問題與管道命令在C
- 18. 詹金斯管道:與管道多行shell命令
- 19. Laravel 5命令 - 調度命令管道
- 20. 嵌套命令和管道命令
- 21. 管道輸出命令shell命令
- 22. Redis複合命令或命令管道
- 23. SSH管道命令錯誤
- 24. Dmesg命令管道它grep
- 25. 寫命令管道(UNIX)
- 26. 管道有多個命令
- 27. 選項| (管道)命令
- 28. 管道輸出命令
- 29. 管道命令到Windows上
- 30. 無法將docker pid管道打擊命令
您似乎期待第二個'echo'的行爲像'貓'。 –