
head -c 3 sample.txt
プロンプトで、ユーザー名の前に出力が表示されます。
Theuser@localhost:/home$
The
その後はもう印刷できません$
。
私の端末がなぜこれを行うのですか?
答え1
The
その後印刷されませんでした。$
なぜこれを行うべきですか?head
最初に印刷した後、シェルは次のコマンドを入力するように求めます。プロンプトが別の行に表示されると予想するのはやや合理的ですが、後ろに(次のような)The
。
head -c 3 sample.txt
The
後で改行なしで正確に印刷されますe
。head
標準出力(この場合は端末)に3バイトを印刷するように要求すると、正確に3バイトが得られます。その中に改行文字はありません。
通常、echo
コマンド(たとえば)のテキスト出力は改行文字で終わります。コマンドが終了すると、シェルがプロンプトを印刷すると、改行文字の直後にプロンプトが印刷されるため、新しい行の先頭にプロンプトが表示されます。
あなたの場合は、後ろに改行文字がないので、The
シェルが端末に印刷されると、プロンプトが同じ行に表示されます。
一部のシェルはこれがすぐに起こることを検出します。あなたのシェルは明らかにそうではありません。
行を処理するツールは、その文字が実際に自分の行に属するため、改行を使用して印刷します。たとえば、ソースデータの最後の行が不完全な場合(つまり、末尾の改行がない場合)、その行をsample.txt
無視するか、そのまま印刷するか(改行なしで)修正(改行を追加)して処理できます。 );これはツールとその成果によって異なります。
完全な行を含むだけでsample.txt
なく、head -n
行を処理することでも完全な行が期待できます。ただし、head -c
バイトを扱うときに印刷する最後のバイトが改行文字であることを事前に知らない限り、出力の最後の行が完了したと仮定してはいけません。
echo
後で引数なしで呼び出すことで、改行文字を簡単に追加できますhead
。
head -c 3 sample.txt; echo
これにより、プロンプトがほぼ確実に別々の行に表示されます。この改行文字echo
ではなくから来るということを覚えておいてくださいsample.txt
。
head
*カーソルの移動などを含む端末制御シーケンスを出力する場合は例外です。これらのシーケンスが3バイトに収まるとは思わないが、通常、ファイルにそのシーケンスが含まれていて、端末がそれを理解して十分なバイトを要求すると、端末はそれに従います。このような場合は、どこからでもプロンプトを見ることができます(またはもっと悪い)