私は標準的なリダイレクトを行っています:
$ cat file.txt | /usr/bin/program
ただし、ターミナルで直接実行して入力をコピーして貼り付けると、プログラムの動作が異なります。入力が端末の場合、進行状況バーを表示します。とにかくプログレスバーが欲しいです。
要するに、入力が端末から来て、ファイルからリダイレクトされないプログラムを「チート」するにはどうすればよいですか?
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 システム全般もそうです。
書籍:
W Richard Stevens、Stephen A Rago Unix 環境での高度なプログラミング、第 3 版
Marc J Rochkind 上級 Unix プログラミング、第 2 版
希望する効果を得るには、疑似 tty を使用する必要があります。'man pty' はそれについてもっと教えてくれます。
プログラムが 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
色付きの出力が表示されるはずです。