回答
$ while read line
> do
> tr 3 4
> done<<EOF
> 1
> 2
> 3
> 4
> EOF
2
4
4
這裏會發生什麼是read line
獲取具有1 第一行輸入的其餘部分傳遞給tr
,其與4代替3,所以2 3 4變爲2 4 4
1進入一個變量行。示例
$ while read foo; do echo "This is $foo"; done <<EOF
> madness
> SPARTAAAAAAAAAAAA
> EOF
This is madness
This is SPARTAAAAAAAAAAAA
您看到的奇怪行爲是因爲read是內建的,並且有點特別。例如,當您執行管道配置時,例如,假設您編寫了
echo "foo bar" | read i
您會希望在$ i中找到某些東西,對不對?嘗試一下,它將是空的。爲什麼? 當您執行管道時,管道的每個命令都在子shell中運行。這對所有事情都是如此,並始終如此。
讀是有點奇怪,因爲它不是一個命令,它是一個內置的shell,它必須導出一個變量,以便您可以看到它。如果你使用管道,就像上面的例子一樣,它會在子進程(subshell)中導出i
,你永遠不會看到它,因爲你正在使用的shell環境是父進程,並且子shell不能設置環境其父母。
在你的情況下,會發生什麼read
和while
作爲內建函數在您的shell中執行。 read
盡職盡責地將stdin的第一件事情設置爲同一個shell的變量。這將從stdin中移除1,因爲這是內置讀取的內容。 stdin現在剩下的東西被傳遞給tr,因爲在此期間,stdin被第一個命令攔截。試試這個
$ while true; do rev; echo "x"; done <<EOF
> hello
> EOF
olleh
你會一直停留在一堆x。 rev已經完成(在第一行中檢查它的輸出),stdin被關閉(你用EOF做過)。 while循環會一直持續下去(你會得到一個x的級聯),但是你不能再提供任何對rev的東西,因爲你不再爲stdin打字。
Stefano的回答非常好。 也許你想這樣做?
tr 3 4 <<EOF
1
2
3
4
EOF
這是Stephano答案的後續行動 - 所有功勞都應歸功於他。這裏是你如何能理解這一點:
首先你問sh'讀'一行,所以它。然後你問它做'tr 3 4'。現在,'read'只讀取一行,但'tr'將讀取所有的輸入,直到完成,所以當你回到'讀'時,沒有什麼更多的標準輸入和程序完成。因爲你從來沒有告訴sh來echo $ line,所以你不會在輸出中得到1。
以下應該打印1 2 4 4
while read line
do
echo $line | tr 3 4
done
- 1. Sh腳本是什麼`$?`?
- 2. 爲什麼sh腳本不能工作
- 3. 爲什麼下面的程序不會生成任何可見的輸出?
- 4. 爲什麼下面的兩個代碼會生成不同的輸出?
- 5. 爲什麼下面的代碼不會產生任何輸出?
- 6. 什麼是sh腳本中的$ {Tmp0}?
- 7. 強制下載腳本和readfile:爲什麼readfile輸出我的html頁面?
- 8. 爲什麼這個腳本只能輸出一半的輸出?
- 9. 爲什麼在shell腳本輸出文件被寫成單行?
- 10. Python CGI - 腳本輸出生成頁面的源代碼
- 11. 在wxpython文本控件中輸出由logging.info生成的輸出
- 12. 爲什麼找不到腳本輸出到標準輸出?
- 13. 爲什麼我應該版本控制由Xtext/Xtend生成的所有文件?
- 14. 什麼是=〜在下面的腳本
- 15. 爲什麼`((0))`在.sh腳本中返回值爲1?
- 16. 我的sh腳本有問題不知道爲什麼?
- 17. 爲什麼Sh和Bash之間的命令輸出不同?
- 18. 爲什麼下面的代碼的輸出爲零?
- 19. 爲什麼下面的程序給出了輸出:A
- 20. 如何使用child_process.spawn生成從ruby腳本輸出流輸出
- 21. Schematron sh腳本不行爲
- 22. 下面的代碼會輸出什麼,爲什麼?誰能解釋一下?
- 23. 爲什麼下面的程序將-80作爲輸出?
- 24. 爲什麼printf在我的簡單腳本中產生奇怪的輸出?
- 25. perf腳本輸出是什麼意思?
- 26. 由PowerDesigner生成的sql server腳本
- 27. 爲什麼我的隨機生成的數組只輸出零?
- 28. 爲什麼生成的輸出文件的行數不同
- 29. 爲什麼MSXML中的createProcessingInstruction生成不完整的輸出?
- 30. 生成腳本時出錯
這是在過去的考試對象,我躍躍欲試,而我無法理解的輸出。我不明白爲什麼它會跳過1. – LDK 2009-08-10 19:07:02
我也不明白,爲什麼'read line'會得到第一行,只有其餘部分纔會被tr? '1'去哪裏? – 2009-08-10 19:22:39
它進入一個變量$行 – 2009-08-10 19:32:13