UNIXシェルでは、コンソールへの出力に標準出力とエラー出力の2つがありますが,例えばsshのパスワードプロンプト等,どちらにも該当しない出力があります.

質問は2つです。
1. このような出力は,どのAPIでコーディングされているのでしょうか?
2. bash等のシェルで,この出力をファイルにリダイレクトする方法はありますか?

2.について,具体的には MacOSX の DarwinPorts(MacPorts) の port コマンドで,-d オプションで出力されるログをリダイレクトする方法を知りたいのです.
2>&1 等,エラー出力をリダイレクトする方法は知っています.
宜しくお願いします.

回答の条件
  • 1人2回まで
  • 登録:2007/02/09 12:53:55
  • 終了:2007/02/09 15:11:07

ベストアンサー

id:hujikojp No.1

hujikojp回答回数101ベストアンサー獲得回数72007/02/09 15:02:19

ポイント100pt

1. ssh_read_passphreadで"/dev/tty" を直接 openしています。

2. shellだけでは redirectするのはむりでしょう。scriptコマンドなどを使えばログはとれると思います。

ちなみに DarwinPortsの -dで出てくるデバッグログは標準エラー出力にでているようなので、

 $ port info vim 2>& log

で redirectできました。

MacPorts 1.320です。

id:syd_syd

ありがとうございます。scriptコマンドというのは初めて知りました。

1. /dev/ttyを直接ですか、なるほど。

2.については、 2>&1 >file.txt とやればエラー出力もfile.txtに出力されると勘違いしていました:-P

2007/02/09 15:08:00
  • id:syd_syd
    nohup でこのような出力もファイルに書き出すことはできるみたいですが…情報お待ちしています。
  • id:bonlife
    ファイルディスクリプタが分かればリダイレクトできそうな気がします。
    (今環境がないので試してません。)

    psでpidを調べて、 fstat -p <pid> でそのプロセスのファイルディスクリプタを調べてみてはいかがでしょうか。
  • id:t-wata
    > 2.については、 2>&1 >file.txt とやればエラー出力もfile.txtに出力されると勘違いしていました:-P

    リダイレクタは右側から評価されるので、標準エラーを標準出力にマージしてファイルに出すなら、

    > file 2>&1

    ですよ。
  • id:hujikojp
    回答に書いたのはエラー出力だけをリダイレクトする方法です、念のため。
    マージして出力する方法については t-wataさんのとおり。
  • id:syd_syd
    みなさまありがとうございます。
    どの方からも素晴らしいコメントを頂けました。
    私はまだまだ勉強不足でした…
    回答を締切るのも早過ぎたかな。

    >t-wataさま,hujikojpさま
    リダイレクトについては、何時も
    > file 2>&1
    としていたはずが、暫く書かないうちにうろ覚えで逆になってしまったようです。

    >bonlifeさま
    ファイルディスクリプタを用いる方法は、もしファイルディスクリプタを奪う方法があるならとても面白いと思います。gdb等のデバッガを使ってアタッチすればいけそうな気もしますが、また質問になってしまいますので分かり次第ここにフィードバックします。
  • id:syd_syd
    ちなみに、 fstat(1) は OSX には入ってませんでした。BSD系なのに。
    そのかわり lsof(8) がありました。lsof -p <pid> とやればよさそうです。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません