出力が端末に渡されたときに動作を変更するコマンド(カラー出力の生成など)が与えられた場合、変更された動作を維持しながらパイプラインからその出力をどのようにリダイレクトできますか?私が知らないユーティリティがあるでしょう。
一部のコマンド(例grep --color=always
:)には動作を強制するオプションフラグがありますが、問題は出力ファイル記述子テストにのみ依存するプログラムでこれを解決する方法です。
重要な場合、私のシェルはbash
Linuxにあります。
答え1
ツールセットの歴史
このようなツールが欲しい人はあなたが初めてではありません。人々は30年間このような道具を求めてきました。その人々もかなり長い間周りにいました。
この種の仕事のための最初のツールは、Rich Salzが「Ginsuナイフ」と描写したDaniel J. Bernsteinの「pty」パッケージでした。 Bernsteinは1990年代初めにネットハックをだますために書いた(sic!)。 「pty」パッケージのバージョン4は1992年にリリースされましたcomp.sources.unix
(Volume 25、Issues 127-135)。 World Wide Webではまだ見つかります。 Paul Vixieは当時こう説明しました。
私は何と言うことができますか?切って、カチカチ切って、皿洗いし、犬散歩させることです。これは「ただ働きます」。言い換えれば、指示に従うと、髪を引っ張ったり、挽いたり、他の標準的な移植活動なしで機能するパッケージを入手したりすることができます。
Bernsteinは、後で「ptyget」パッケージを使用して1999年4月7日以前にそれを更新し、次のように発表しました。
私は新しいpseudo-ttyアロケータptygetを組み立てました。アルファ版はで利用可能です
ftp://koobera.math.uic.edu/pub/software/ptyget-0.50.tar.gz
。参加するには、ptygetメーリングリストがあります。に空のメッセージを送信してください[email protected]
。私はptygetのインターフェースを最初からデザインしました。 ptyよりもモジュール化されています。デフォルトのptyインタフェースは3つの部分に分けられます。
ptyget
:新しいpseudo-ttyを割り当て、それを選択したプログラムに渡す小さな低レベルプログラム(パッケージ内の唯一のsetuidプログラム)ptyspawn
:擬似端末で子プロセスを実行し、子プロセスが終了するのを待って停止状況を観察するもう1つの小さなプログラムです。ptyio
:データを前後に移動するもう少し大きな別のプログラム古い "Ginsu"ナイフは
pty
"Ginsuptybandage
"と表記されていますptyget ptyio -t ptyspawn
。これはネットワークプログラムをpseudo-ttyに接続するために使用され、今では「Ginsu」とpty -d
表記されています。そしての同義語です。セッション管理機能を別々のパッケージに分割しました。ptyrun
ptyget ptyio ptyspawn
nobuf
ptyget ptyio -r ptyspawn -23x
別のパッケージは「sess」パッケージです。
ちなみに、「ptyget」は、出版された数少ないケースの1つであるBersteinのまだリリースされていない「リワークされた」ビルドシステムの初期バージョンを示すことで有名です。 dependon
それは明らかな信号ですredo-ifchange
。
使用法
ptybandage
ptybandage
人々は通常ログインセッションで欲しいものです。主なユースケースは、標準の入力、出力、またはエラーが実際にシェルパイプにある場合でも、この方法で実行されている端末に接続されているかどうかに敏感なプログラムを持つか、標準のファイル記述子をファイルにリダイレクトすることです。 。
実行するにはコマンドが必要であり(もちろん、適切な外部コマンドである必要があります)、標準入力、出力、およびエラーが端末に接続されていると思うように元の標準入力ptybandage
に接続して実行します。 、出力およびエラー。
これにより、ジョブ制御シェルで実行される微妙な違いが処理され、ターミナルSTOP文字が停止するだけでなく、ptybandage
実行中の内部ターミナルに接続されているプログラムも停止します。
ptyrun
ptyrun
人々は通常TCP Webサーバーで欲しいものです。主なユースケースは、端末が独自に設定されておらず、端末なしで期待どおりに実行されないプログラムを実行するリモート実行環境です。
ジョブ制御シェルで実行されることは予期されておらず、実行中のコマンドが停止信号を受信すると、単に再起動されます。
利用可能なツールセット
Dru Nelsonは「pty」と「ptyget」のバージョン4をリリースしました。
Paul Jarcは、オペレーティングシステムが実際に提供しなくなった元のバージョンでオペレーティングシステム固有の擬似端末デバイスioctlを処理しようとするptygetの修正バージョンをリリースしました。
nosh ソースパッケージには、Laurent Bercot のツールと nosh パッケージの独自の疑似端末管理コマンドを使用する同様のタスクとptybandange
スクリプトが付属しています。 nosh バージョン 1.23 以降、nosh-terminal-extras パッケージに事前パッケージされて提供されます。 (以前のバージョンではソースからビルドする人だけが利用できました。)ptyrun
execline
いくつかの例は次のとおりです。
ptybandage
AIXのJurjgen Oskamパスワードプロンプトの制御端末を明示的に開いて読み取るプログラムにこの文書の入力を提供します。
$ptybandage dsmadmc <<EOF>uit.txt ヨスカム パスワード クエリセッション クエリプロセス 辞める EOF
ptyrun
OpenBSDのアンディ・ブラッドフォードdaemontoolsとucspi-tcpで、bgplgsh
対話型ルーター制御プログラムが端末と通信していると考えながらネットワーク経由でアクセスできるようにします。
#!/bin/sh 2>&1を実行 envuidgid rviews tcpserver -vDRHl0 0 23 ptyrun /usr/bin/bgplgsh 実行
追加読書
- ダニエル・バーンスタイン(1992-02-19)。 v25i127:擬似ttyデバイス用の共通インタフェース。 comp.sources.unix. 25(127).
- ダニエル・バーンスタイン(1991-10-04)。 セッション管理の紹介。 TTYのバーンスタイン。 JdeBP。
- ポールザック。 プティガット。 Paul Jarcのソフトウェア。
- ジョナサンデボインポラード(2016)。Daniel J. Bernsteinのptygetツールセット。ソフトウェア。
- ドリューネルソン。 ドリューDrew/pty4。 GitHub。
- ドリューネルソン。 ドリュードリュー/パティゲート。 GitHub。
- ローランベルコ。実装する。ソフトウェア。
- ジョナサンデボインポラード(2016)。 ソフトウェア統合(Daniel J. Bernstein)。ソフトウェア。
- ジョナサンデボインポラード(2014)。 スナックバッグ。ソフトウェア。
- ジョナサンデボインポラード(2012)。 はじめに
redo
。一般的な答え。 - フロート湖。
bgplgsh
。 8. OpenBSD のマニュアルページ。
答え2
あなたはそれを使用して必要なものを得ることができますunbuffer
。
unbuffer
tcl
/スクリプトですexpect
。必要に応じてソースを確認してください。また、manのCAVEATSセクションも参照してください。
また、エイリアシングを実行しません。たとえば、次のようになります。
alias ls='ls --color=auto'
Stéphane Chazelasが指摘したトリックを追加しない限り:
(末尾のスペースに注意してください)を実行すると、エイリアスがalias unbuffer='unbuffer '
後ろに拡張されますunbuffer
。
答え3
答え4
試してみてはいかがでしょうかscript(1)
?
たとえば、
script -q -c 'ls -G' out_file
出力が保存さls
れ、out_file
カラーコードが保持されます。