script(1)の出力に改行CR+LF(dosスタイル)があるのはなぜですか?

script(1)の出力に改行CR+LF(dosスタイル)があるのはなぜですか?

コマンドのタイプスクリプトscript(保存されたファイルなど)では、改行文字はCR + LF(\ r \ n)ですが、元の改行文字(に入力されたものscript)はLFです。なぜ?これはttyの問題のようです。よくわかりません。詳しく説明せずにこれを説明できる人はいますか?

私は何の問題もありませんでした。ただ気になりました。 :) (しかし、修正する方が良いと思います。または少なくとも文書化する必要があります。)

私はscriptutil-linuxから来ましたが、おそらくそれほど重要ではありません。

答え1

プログラム出力とキャプチャされたttyストリーム(たとえば)typescriptの違いの根本的な理由は、ttyが印刷機

Unix以前は、テキストが行末に常にCRLFを持っていました。これは、行末の論理表現と見なされたためではなく、各文字が実際の物理的な意味を持っていたためです。言い換えれば、プリントヘッドを左に最後まで動かし、紙を前進させる。

Unixはまったく新しいアプローチを取ります。ディスク上のテキストファイルをプリンタのコマンドではなく、それ自体が便利なオブジェクトとして扱い、行を論理オブジェクトとして扱います。 UNIX の世界観では、2 つの文字行終端は不必要に複雑です。

しかし、彼らは単一の「行末」文字を認識せず、CRで作業の半分だけを実行し、LFで残りの半分だけを実行できるプリンタやCRTの愚かな端末などの既存のハードウェアを使用する必要がありました。したがって、変換はハードウェアに最も近い(ttyドライバで)実行する必要があります。

それ以来、すべてが以前のバージョンと互換性があります。したがって、CRLFの使用を要求するターミナルエミュレータと、プログラムが出力するときに改行文字を提供するttyドライバがあります。

答え2

出力はtypescriptptyに送信されたすべての文字をキャプチャします。たとえば、改行文字が通常CR + LFに変更されるのを防ぐターミナルドライバを使用している場合、stty -opost出力にはLF文字のみが表示されます。

これが役に立つことを願っています。

col -b < typescript

初めてファイルをクリーンアップします。

答え3

勉強してから自分の答え回答そしてコメント作成者イカルス
「ファイルの改行」と「コンソールの改行」を区別する必要があります。コンソールでは、直感的に実際の改行文字は以下のようにCRLFです。

UNIXルールでは、LFはテキストファイルの改行文字を表し、逆にLFは改行文字を表します。 (「あなたの言葉は」は自然言語のテキストを意味します。)DOS CR + LFなどで、いいね、誰もが知っています。

(Unix)コンソールはより複雑です。まず、LFとCRは制御コードであることを覚えておく必要があります。コントロール太字、色などを制御します。

コンソールにLF(\ n、改行文字)を入力すると、改行文字が表示されます。問題は、まあ、二つ問題は次のとおりです。 (1)コンソールは2階層で構成されています。言い換えれば、フィルタ部分とレンダリング部分で構成されています。 (一時命名法)隠し(一般ユーザーに)フィルタはLFをCRLFに変換します。 (2) レンダラでは、通常の改行文字として CRLF(\r\n) が必要です。詳しくは下記をご覧ください。

このコマンドで生成されたタイプスクリプトファイルはscript (1)文字を記録します。後ろにコンソール入力がフィルタリングされます。これがTypeScriptの改行文字がCRLFである理由です。

詳細など。事実:

  • コンソールレンダラーは、LFを「カーソルを1行下に移動」として印刷し、CRを「カーソルを行の先頭に移動」として印刷します。
  • LF-> CRLF変換をオフにして$ stty -opost消去してこれを実行できます$ stty opost。 「opost」は「output post-processing」の略です。
    • より正確には、opost設定時にLF-> LFCRが変更されます。設定onlcrすると、onocr行の先頭などからCRが削除されます。参照:POSIX第11章汎用端末インターフェース」。
  • Unixでは、「Enter」キーは、キーマッピング用語として「Return」と呼ばれるLFにバインドされています。 (望むよりこの問題もっと学ぶ。 )
  • エスケープコードのバリエーションもあります。man 4 console_codes「ESC D」(¥eD)は改行文字で、「ESC E」(¥eE)は改行文字と呼ばれています。印刷すると、「ESC D」は±opost-nessに関係なく「カーソル下に移動」、「ESC E」はCR+LFです。

いくつかの実験を行うには、別のコンソールで作成することをお勧めします。たとえば、$ echo -ne '1st\n2nd\r\n3rd\n" > /dev/tty1最初の非Xコンソールに書き込んで/dev/pts/0最初のX端末になります。これは最も便利な方法ではありませんが、最も曖昧ではありません。

関連情報