既知のファイル記述子からファイルに出力をリダイレクトするには、次のようにします。
./binary 1> ./file 2>&1
0
ただし、および1
それ以外のファイル記述子を使用できるバイナリファイルがあるとします2
。
ファイル記述子、コマンドが対話的に実行される1
場合、2
デフォルトは現在のファイル記述子です。tty
バイナリを対話的に実行していますが、バイナリに現在のファイルを指す他のファイル記述子があるようです。tty
これは、ファイル記述子をファイル1
にリダイレクトしましたが、2
一部の出力がファイルの代わりに端末に書き込まれているためです。
おそらく使用している他のファイル記述子がたくさんあるでしょうn
。しかし、どのようなものを使用しているのかわかりません。
tty
現在のファイルを指すすべてのファイル記述子をファイルにリダイレクトしたいと思います。
バイナリがどのファイル記述子に書き込まれるかは関係ありません。すべてのストリームはそのファイルにリダイレクトする必要があります。
少し
./binary *> ./file
答え1
コマンドが対話的に実行される場合、ファイル記述子1と2はデフォルトで現在のttyに設定されます。
いいえ、現在はttyを指していません。 stdoutとstderrで、おそらくシェルとターミナルの設定方法で現在のターミナルにルーティングされます。 1つの重要な違いは、リダイレクトがstdoutとstderrを特定のファイル記述子にリンクしますが、端末自体と対話する人はそれに影響されないことです。
man 7 pty
バイナリがまだリダイレクトされていない端末に書き込んでいる場合は、おそらくstdoutと対話しません。 ncursesなどのライブラリを介して擬似端末(詳細)と直接対話しています。
これは文字デバイスであり、作成されたコンテンツを「スヌーピング」することができますが、「線形化された」形式では意味がない可能性があります。アプリケーションが単語を書き換えることを防ぐことはありません(「右に2桁移動、印刷o、右に2桁移動、印刷l、右2桁移動、印刷l、右2桁移動、印刷e、右に2ビットシフト)、 、 "hello"の代わりにh"を印刷します。さらに、これらのプログラムは画面の大部分を即座に更新する傾向がある。