2

我有一个简单的 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
$

这对我来说看起来像是在猪的“g”之后echo附加了一个不可见的。\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 : 

起初我认为 Pythonfileinput模块的行为可能是丢弃文件中的最后一行,如果它是空白的。但是当我尝试使用文件的内容时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(from echo)和文件(from some_lines.txt)都以 a 结尾\n,所以我要么期望两者Line 4 :的输出包含它,要么都不包含它的输出。

4

2 回答 2

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"`

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

于 2013-03-31T11:46:30.893 回答
1

此命令将回答您的问题:

echo 'hi' | od -c

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

玩弄 printf 命令:

printf "%s"  foo
printf "%s\n" anotherfoo
于 2013-03-31T11:15:47.413 回答