0

色が有効になっているシェルがあります。

man -P cat blabla > afile

somefileには、色付け用のエスケープ文字が含まれています。今、私はその色でターミナルいくつかのファイルを出力したいと思います。私は試した:

cat afile

ただし、フォーマットはまったくありません。私が見つけた唯一の方法は

less afile

しかし、ポケットベルは必要ありません。ファイルを出力したいだけで、インタラクティブモードにはなりません。それを行うための簡単なコマンドがあるはずですが、私はそれを見つけることができませんでした:)

4

3 に答える 3

3

作成したファイルを見てください。次のようになります ( viで表示した場合):

LS(1)                     BSD General Commands Manual                    LS(1)

N^HNA^HAM^HME^HE
     l^Hls^Hs -- list directory contents

S^HSY^HYN^HNO^HOP^HPS^HSI^HIS^HS
     l^Hls^Hs [-^H-A^HAB^HBC^HCF^HFG^HGH^HHL^HLO^HOP^HPR^HRS^HST^HTU^HUW^HW@^H@a^Hab^Hbc^Hcd^Hde^Hef^Hfg^Hgh^Hhi^Hik^Hkl^Hlm^Hmn^Hno^Hop^Hpq^Hqr^Hrs^Hst^Htu^Huw^Hwx^Hx1^H1] [_^Hf_^Hi_^Hl_^He _^H._^H._^H.]

D^HDE^HES^HSC^HCR^HRI^HIP^HPT^HTI^HIO^HON^HN
     For each operand that names a _^Hf_^Hi_^Hl_^He of a type other than directory, l^Hls^Hs
     displays its name as well as any requested, associated information.  For
     each operand that names a _^Hf_^Hi_^Hl_^He of type directory, l^Hls^Hs displays the names
     of files contained within that directory, as well as any requested, asso-
     ciated information.

^H?を参照してください。つまり、スペースをバックアップします。このmanコマンドはtroff出力を生成し、その出力を nroff 自体にパイプして、その出力を表示用にフォーマットします。troff は、印刷ページをフォーマットするテキスト フォーマット プログラムでした。したがって、単語を太字にするにtroffは、文字の上にバックスペースを入れてからタイプします。それが繰り返されるほど、文字は濃くなります。

man端末でまたはを使用すると、太字nroffを意味することを理解し、端末の強調表示された色でその文字を表示します。コマンドは同じことを行います。B^HBBless

一方、catコマンドは実際にはファイルをそのまま表示しています。シーケンスB^HBが表示されるBと、画面に が表示され、1 つのスペースがバックアップされB、前の の上に別のスペースが表示されますB。これは端末でありプリンターではないため、その 2 番目Bは前の と同じピクセルの上に表示されますB

これを試してください(Macを使用しているため):

CLICOLOR_FORCE=1
ls > ls.txt
cat ls.txt

これは色を表示することに注意してください。環境変数を設定すると、端末に表示されていない場合でも、色付きの出力がCLICOLOR_FORCE強制的に表示されます。を見ると、やのようなシーケンスが表示されます。これは、ANSI 端末にさまざまな色を設定するよう指示し、それらの色を表示します (オプションを使用しない場合)。lsls.txtVI[34m^[[m^[[mcat-v

言い換えれば、あなたの仮定は逆です。lessコマンドが文字-バックスペース-文字シーケンスを太字で表示する出力を処理している間、Cat はファイルの完全に表現されたバージョンを提供します。

于 2012-12-25T16:02:42.013 に答える
1

私が探していたコマンドは次のように呼ばれulます(下線を引く):

/usr/bin/man -P cat somecommand | ul

これは、端末用にgroffからのBACKSPACEエスケープ形式を適切にフォーマットします。

于 2012-12-25T23:10:05.930 に答える
1

man実際には出力に端末エスケープ シーケンスを入れません。太字の場合char <backspace> charは 、下線の場合は を出力します_ <backspace> char。ページャーはこれらのシーケンスを好みmoreless認識し、太字や下線を引くための適切なターミナル エスケープ シーケンスに変換します。

cat一方、ファイルの内容を出力するだけです。端末固有の翻訳を行う方法がわかりません。端末が を受け取ると<backspace>、カーソルを単純に戻し、次の文字出力で上書きします。manその結果、追加のマークアップなしで読みやすいテキストが得られます (これが、下線を引くときに最初に下線を送信する理由です。別の方法で行った場合、単語が意図されている場所に下線がたくさん表示されるだけです)。

これは で確認できますod -c afile | less。多くの が表示されるはずですが、表示さ\bれません\e

于 2012-12-25T15:35:03.983 に答える