2013-03-31 25 views
2

我有一個簡單的Python腳本line_printer.pyBash/Python:`echo`命令在作爲另一個命令的輸入時插入換行符嗎?

import fileinput 
i = 1 
for line in fileinput.input(): 
    print 'Line', str(i), ':', line.strip() 
    i+=1 

我想了解從echo命令該腳本管道數據如何影響結果與從文件中讀取數據。

考慮下面的呼叫和輸出:

$ echo -e "chicken\ncow\npig" 
chicken 
cow 
pig 
$ 

這對我來說看起來像echo已經附加在豬中的「G」後invisble \n。那麼,爲什麼當我打電話:

echo -e "chicken\ncow\npig" | python line_printer.py 

我得到:

Line 1 : chicken 
Line 2 : dog 
Line 3 : cow 

的輸出,而不是:

Line 1 : chicken 
Line 2 : dog 
Line 3 : cow 
Line 4 : 

起初我還以爲Python的fileinput模塊的行爲可能是放棄文件中的最後一行,如果它是空白的。但是當我嘗試使用文件some_lines.txt的內容:

chicken 
dog 
cow 
<blank line> 

爲輸入:

python line_printer.py some_lines.txt 

我得到的輸出是:

Line 1 : chicken 
Line 2 : dog 
Line 3 : cow 
Line 4 : 

那麼,爲什麼line_printer.py給出不同的結果在輸入取決於它是源於stdin還是源自一個文件?最好我可以告訴,兩個標準輸入(從echo)和文件(從some_lines.txt)以\n完成,所以我要麼期望兩者的輸出包括Line 4 :或輸出既不包括它。

+0

'some_lines.txt'以* two *'\ n'結尾:'cow'和空行(它本身就是一個單獨的'\ n')。 – robertklep

回答

1

此命令將回答您的問題:

echo 'hi' | od -c 

其原因後\n字符是默認的終端在該標準輸出使用行緩衝 - 這意味着它將只顯示輸出數據,與換行字符結束。

玩的printf命令:

printf "%s" foo 
printf "%s\n" anotherfoo 
1

如果在bash的來源看,慶典-4.2 /內建/ echo.def你可以看到內置的echo命令總是(線113)輸出除非-n被指定(第198行)或echo的輸出被用作字符串(第166行),否則最終\n(行194)。您可以通過執行

echo `echo "Ho ho ho"` | od -c 

測試這個你會看到只有一個\n因爲echo "Ho ho ho"輸出作爲表達echo `echo "Ho ho ho"`字符串進行評估。

它似乎與終端設置沒有任何關係。