私が使用している場合:
strace echo 'a
b
c' > file
結論は次のとおりです。
write(1, "a\nb\nc\nd\n", 8) = 8
しかし、
strace echo 'a
b
c
d' > /dev/pts/0
この行は次のとおりです。
write(1, "a\n", 2) = 2
write(1, "b\n", 2) = 2
write(1, "c\n", 2) = 2
write(1, "d\n", 2) = 2
2番目のケースは1行ずつ書き、1番目のケースは一緒に書くのはなぜですか?端末が文字デバイスであるためかもしれませんが、文字デバイスは次のように定義されます。
文字(char)デバイスは、バイトストリーム(ファイルなど)でアクセスできるデバイスです。文字デバイスと一般ファイルとの唯一の関連する違いは、通常ファイルでは常に前後に移動できることです。一方、ほとんどの文字デバイスはデータチャネルに過ぎず、順番にのみアクセスできます。
編集:シェルはbashです。
ベストアンサー1
これはとても簡単です。
echo
実行中の外部コマンドはstrace
GNU coreutilsのコマンドである可能性が高いです。これはCプログラミング言語で書かれており、Cランタイムライブラリ関数(およびputchar()
)を使用して、fputs()
プログラムの標準出力に必要な内容を作成します。
C言語では標準出力に出力できます。完全にバッファリング、ラインバッファまたはバッファリングされていない。発生するルールは実際にはC言語仕様の一部であり、オペレーティングシステム全体に適用され、標準出力が「対話型デバイスを参照しないことを決定できるかどうか」という抽象用語で書かれています。
isatty()
UnixおよびLinuxオペレーティングシステムでは、ファイル記述子が端末ではないことを示す場合、標準出力が完全にバッファリングされるように適用されます。この場合、これは「対話型デバイス」です。オペレーティングシステムでは、標準出力はラインバッファリングされます。 C言語標準は後者を必要としません。これがGNU Cライブラリに含まれているものです。またC言語標準に規定されている内容に加えて、C言語標準が実行する作業も文書化されています。
したがって、echo
コマンドの標準出力が端末ではなくファイルの場合、プログラムのCライブラリは標準出力へのすべての個別の書き込みをバッファリングし、バッファがいっぱいになるか、プログラムがwrite()
完了すると大きな呼び出しを行います。そして標準出力の場合はい端末、Cライブラリはコンテンツのみをバッファリングします。出力改行文字まで、write()
このときバッファの内容です。
したがって、観察されたシステムコールがあります。