3

私は標準的なリダイレクトを行っています:

$ cat file.txt | /usr/bin/program

ただし、ターミナルで直接実行して入力をコピーして貼り付けると、プログラムの動作が異なります。入力が端末の場合、進行状況バーを表示します。とにかくプログレスバーが欲しいです。

要するに、入力が端末から来て、ファイルからリダイレクトされないプログラムを「チート」するにはどうすればよいですか?

4

3 に答える 3

5

expectプログラムを使用するのが最も簡単かもしれません。必要な作業のほとんどを実行します。

必要な作業は面倒です。これには、端末のようなプログラムに見えるデバイスである疑似 tty の使用が含まれます。自分でロールバックする場合、知っておく必要がある POSIX システム コールは次のとおりです。

インターフェイスは比較的新しいものです(posix_openpt()リストされている他の機能については、Issue 4、バージョン 2 と比較して、Issue 6)。システムに がない場合posix_openpt()は、Unix の本 (Stevens または Rochkind など) を入手して、pty のマスター側を開く方法を見つけるか、システムのマニュアルを注意深く読む必要があります。ただし、上記のリンクの論理的根拠posix_openpt()も役立つ場合があります。他の機能を使用するためのガイドラインもあります。Linuxにはposix_openpt(); Mac OS X もそうですし、推測によると BSD システム全般もそうです。

書籍:

于 2013-02-25T03:30:47.787 に答える
3

希望する効果を得るには、疑似 tty を使用する必要があります。'man pty' はそれについてもっと教えてくれます。

于 2013-02-25T01:54:47.983 に答える
3

プログラムが glibc 関数isatty()を呼び出して、stdin/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;
}

メイクファイル

# Make the shared Library
lib: libisatty.c
    gcc -shared -Wl,-soname,libisatty.so.1 -o libisatty.so.1.0  libisatty.c 
    ln -s libisatty.so.1.0 libisatty.so.1
    ln -s libisatty.so.1 libisatty.so

走る:

make lib

正常にビルドされるはずです。Ubuntu12.04 AMD 64 でテストしました。

次に、ライブラリをテストします。:)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

色付きの出力が表示されるはずです。

于 2013-02-25T01:58:01.937 に答える