これにより、端末に接続されていないことが検出されます。これは十分に公平ですls | less
。ls
その他less
はい端末に接続してください。この設定では、ls
端末の色と列形式の出力が生成され、less
正しく処理されます。を使用して色が正しく機能するようにすることができますが、ls --color=force | less -r
より多くの入力が必要で、列は実行されません。
less
実際の端末のように扱うために接続されているすべてを知らせるスイッチがあれば素晴らしいでしょう。これにより、.NETls | less -T
でカラーリストと列形式のリストの両方を取得できますless
。
このようなことをしたことがありますか?
less
このようなポケットベルは実際にそれを自分で実行できますか、それともシェルの協力が必要ですか?たとえば、シェルはls
接続する疑似端末を設定する必要がありますか?
答え1
パイプラインを設定するシェルです。less
無関係。
これにより、ls | less
パイプの書き込み終了を実行するプロセスの標準出力と同じパイプの読み取り終了を実行するプロセスの標準入力を生成した後、シェルが同時に開始されますls
。less
ls
less
ls
標準出力がttyデバイスではないことを検出し、それに応じて動作を変更します。less
これについて私たちができることは何もありません。
何ですかシェルできることは、パイプの代わりに擬似端末ペアを使用して2つのプロセスを接続することです。しかし、疑似端末はこのために設計されていないので、これは悪い考えです。まず、切断は問題を引き起こします。less
標準入力が疑似端末ホストの場合は混乱する可能性があります。
ls
別のアプローチは、擬似端子ペアを介して出力を読み取り、less
それをパイプに接続する3番目のプロセスを取得することです。@JdeBPptyrun
またはptybandage
、またはexpect
のunbuffer
またはzsh
のzpty
組み込み関数を使用して:
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
呼び出しても拡張されます。ttypager
ls
また、stdoutとstderrの両方がこの擬似端子に入り、最終的にパイプに入ります。
これはまだ汚いハッキングです。ここで最も簡単な方法は、ls
端末に接続されているかのように動作するように指示することです。
以下のヘルパー機能を使用できます。
paged_ls() { ls -C --color=always "$@" | less -RFX; }
ここでは-C
、出力を列に強制し(ls
GNUを含む一部の実装では、出力が端末に到達したときにデフォルトでこれを行います)、出力が端末に到達するかどうか--color=always
にかかわらず、出力を色で強制します。
答え2
これを行う一般的な方法は、Bernsteinなどのツールを使用することですptybandage
。
$ptybandage ls>あまり振れません。
またはこの場合、Bernsteinの次の方が良いですptyrun
。
$ptyrun ls |
追加読書
- https://unix.stackexchange.com/a/249801/5132
- バーンスタイン、ダニエル(1996)。
ptyrun
。DJBウェア。 - バーンスタイン、ダニエル(1996)。
ptybandage
。DJBウェア。 - ジョナサンデボインポラード(2014)。
ptyrun
。スナックガイド。ソフトウェア。 - ジョナサンデボインポラード(2014)。
ptybandage
。スナックガイド。ソフトウェア。