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 : 

最初は、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 (from echo) とファイル (from some_lines.txt) の両方が で終わる\nので、両方の出力に が含まれるか、どちらの出力にも含まれないと予想Line 4 :されます。

4

2 に答える 2

1

このコマンドはあなたの質問に答えます:

echo 'hi' | od -c

末尾の文字の理由は\n、端末の stdout がデフォルトで行バッファリングを使用するためです。つまり、改行文字で終わる出力データのみが表示されます。

printf コマンドをいじってみましょう:

printf "%s"  foo
printf "%s\n" anotherfoo
于 2013-03-31T11:15:47.413 に答える
1

bash ソースの bash-4.2/builtins/ echo.defを見ると、組み込みechoコマンドが常に (113 行目) 最終\n(194 行目) を出力することがわかります。文字列 (166 行目)。これをテストするには、次のようにします。-necho

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

\nの出力はecho "Ho ho ho"式の文字列として評価されるため、表示されるのは 1 つだけecho `echo "Ho ho ho"`です。

端末の設定とは関係ないようです。

于 2013-03-31T11:46:30.893 に答える