Bash / Python:`echo`命令在作为另一个命令的输入时插入换行符吗?

时间:2013-03-31 10:59:40

标签: python bash

我有一个简单的python脚本line_printer.py

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”之后附加了一个隐身\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还是源自文件?我能说的最好,stdin(来自echo)和文件(来自some_lines.txt)都以\n结束,所以我要求两者的输出都包括{{1或者两者的输出都不包括它。

2 个答案:

答案 0 :(得分:1)

此命令将回答您的问题:

echo 'hi' | od -c

尾随\n字符的原因是默认情况下终端上的stdout使用行缓冲 - 这意味着它只显示以换行符结尾的输出数据。

使用printf命令:

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

答案 1 :(得分:1)

如果查看bash源bash-4.2 / builtins / echo.def,你可以看到内置echo命令总是(第113行)输出最终\n(第194行),除非指定-n(第198行)或echo的输出用作字符串(第166行)。您可以通过

进行测试
echo `echo "Ho ho ho"` | od -c

您只会看到一个\n,因为echo "Ho ho ho"的输出在表达式echo `echo "Ho ho ho"`中被计算为字符串。

它似乎与终端设置没有任何关系。