8

パイプを介してプログラムの出力を実行したいのですがstdout、対話型シェルではないことが検出されると、明らかに動作が異なります。

通常の状況と同じように、どうすればそれをだましてパイプを介して書き込むことができますか?

4

3 に答える 3

18

プログラムが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

于 2013-02-04T20:24:59.937 に答える
2

script私のために作品を使用する:

script outputfile.txt yourcommand
# any output ends up in outputfile.txt

あなたは私が推測するパイプにこれを使用することができます:

script out.txt yourcommand ; cat out.txt | nextcommand
于 2015-04-02T15:38:21.823 に答える
0

これを試してみてください:

./script.sh < `tty` > output

プログラムが のようなことをしている場合isatty(0)、これで十分かもしれません。

于 2013-02-04T15:39:16.960 に答える