パイプを介してプログラムの出力を実行したいのですがstdout
、対話型シェルではないことが検出されると、明らかに動作が異なります。
通常の状況と同じように、どうすればそれをだましてパイプを介して書き込むことができますか?
プログラムがglibc関数isatty()
を呼び出して、stdoutが端末かどうかを確認すると仮定します。これは、端末でカラー化された出力を使用するプログラムや、カーソルの配置や行の消去/再描画などの ANSI 端末の他の機能を使用するプログラムで一般的です。
LD_PRELOAD 環境変数を使用してプログラムをだますことができます。LD_PRELOAD は ELF リンカによって処理され、動的ライブラリを他のライブラリより先にロードする必要があることを示します。この機能を使用すると、ライブラリ関数 (あなたの場合は glibc function ) をオーバーライドできますisatty()
。たとえば、この記事に従うことができます。
私はあなたのために例を用意しました:
最初にファイルlibisatty.cを作成します。
/**
* Overrides the glibc function. Will always return true.
*
* Note: Although this should be ok for most applications it can
* lead to unwanted side effects. It depends on the question
* why the programm calls isatty()
*/
int isatty(int param) {
return 1;
}
共有ライブラリとしてコンパイルします。
gcc -shared -o libisatty.so libisatty.c
それはうまく構築する必要があります。
次に、ライブラリをテストします。:)ls --color=auto
テストにコマンドを使用しました。出力を色付けするかどうかを決定するls
呼び出し。isatty()
出力がファイルまたはパイプにリダイレクトされる場合、色付けされません。次のコマンドを使用して、これを簡単にテストできます。
ls --color=auto # should give you colorized output
ls --color=auto | cat # will give you monochrome output
次に、LD_PRELOAD 環境変数を使用して 2 番目のコマンドを再試行します。
LD_PRELOAD=./libisatty.so ls --color=auto | cat
色付きの出力が表示されるはずです。
ところでクールなユーザー名: uʍop ǝpısdn !!:D
script
私のために作品を使用する:
script outputfile.txt yourcommand
# any output ends up in outputfile.txt
あなたは私が推測するパイプにこれを使用することができます:
script out.txt yourcommand ; cat out.txt | nextcommand
これを試してみてください:
./script.sh < `tty` > output
プログラムが のようなことをしている場合isatty(0)
、これで十分かもしれません。