追加読書

追加読書

これにより、端末に接続されていないことが検出されます。これは十分に公平ですls | lesslsその他less はい端末に接続してください。この設定では、ls端末の色と列形式の出力が生成され、less正しく処理されます。を使用して色が正しく機能するようにすることができますが、ls --color=force | less -rより多くの入力が必要で、列は実行されません。

less実際の端末のように扱うために接続されているすべてを知らせるスイッチがあれば素晴らしいでしょう。これにより、.NETls | less -Tでカラーリストと列形式のリストの両方を取得できますless

  1. このようなことをしたことがありますか?

  2. lessこのようなポケットベルは実際にそれを自分で実行できますか、それともシェルの協力が必要ですか?たとえば、シェルはls接続する疑似端末を設定する必要がありますか?

ベストアンサー1

パイプラインを設定するシェルです。less無関係。

これにより、ls | lessパイプの書き込み終了を実行するプロセスの標準出力と同じパイプの読み取り終了を実行するプロセスの標準入力を生成した後、シェルが同時に開始されますlslesslsless

ls標準出力がttyデバイスではないことを検出し、それに応じて動作を変更します。lessこれについて私たちができることは何もありません。

何ですかシェルできることは、パイプの代わりに擬似端末ペアを使用して2つのプロセスを接続することです。しかし、疑似端末はこのために設計されていないので、これは悪い考えです。まず、切断は問題を引き起こします。less標準入力が疑似端末ホストの場合は混乱する可能性があります。

ls別のアプローチは、擬似端子ペアを介して出力を読み取り、lessそれをパイプに接続する3番目のプロセスを取得することです。@JdeBPptyrunまたはptybandage、またはexpectunbufferまたはzshzpty組み込み関数を使用して:

zmodload zsh/zpty
ttypager() { (zpty c "stty raw -echo; ${(q)@}"; zpty -r c) | less -RFX; }

ttypager ls

ls新しい端末の新しいセッションで実行されるため、^ Cを押すとSIGINTを受信できず、less書き込みが完了する前に終了するとSIGPIPEは受信されません。ただし、この場合、マスターを保持するプロセス(ここではサブシェル)はlsまだSIGHUPを受けて終了します。

zptyここでは、 を使用するかのようにコマンドを実行するので、evalエイリアスが拡張されます。実際に引き数を受け取り、後でエイリアス拡張を実行するため、ttypager \ls呼び出しても拡張されます。ttypagerls

また、stdoutとstderrの両方がこの擬似端子に入り、最終的にパイプに入ります。

これはまだ汚いハッキングです。ここで最も簡単な方法は、ls端末に接続されているかのように動作するように指示することです。

以下のヘルパー機能を使用できます。

paged_ls() { ls -C --color=always "$@" | less -RFX; }

ここでは-C、出力を列に強制し(lsGNUを含む一部の実装では、出力が端末に到達したときにデフォルトでこれを行います)、出力が端末に到達するかどうか--color=alwaysにかかわらず、出力を色で強制します。

おすすめ記事