性格いい人が優勝

bashのスクリプトについて質問させてください。

現在、サーバプログラムexecの起動とログ出力を以下のコマンドで実行しております。

exec > server.log

しかし、execの出力行の中に、server.logをviで開くことができないような、文字数の多い行が出力されるようになったため
整形してリダイレクトしたいと考えております。そこで

exec | fold -w 256

としたところ、exec起動時のログが整形されて正しく標準出力されました。

しかし、これを下記のようにリダイレクトしてファイル出力した場合、起動時のログが尻切れとなり、最後まで出力されませんでした。

exec | fold -w 256 > server.log

起動後にサーバに接続し、以降のサーバーログを出力させると、尻切れから先が出力されはしたのですが、
現在、起動後にserver.logを確認すると最終行の「server startup OK」という文字が確認できない、という状況になっております。

リダイレクトされたファイルにも、標準出力と同期して最終文字まで出力させる方法はございますでしょうか?

よろしくお願いいたします。

A 回答 (2件)

意味が最初わからなかったのですが、execとお書きなのはシェルの組み込みコマンドのexecでなくて、実際にはexecではないプログラム名称を書き換えてexecとお書きなのですね。


(例示であればfooだとかhogeだとかの方が良いです)

No1の方がお書きのようにバッファリングの問題であるなら(プログラムを終了させるとちゃんとファイルに出力されるのなら)、バッファリングしない(もしくは行単位でバッファリングする)プログラムを使うしか無いですね。

OSは何でしょう?Linuxではなさそうですが。
折り返しだけなら自分でCでプログラムを書くというのもありそうです。

あとは、そのままファイルに書いて、viで開く前にfoldするとか。

この回答への補足

回答ありがとうございます。

> 例示であればfooだとかhogeだとかの方が良いです
ご指摘ありがとうございました、以降気をつけます。

> OSは何でしょう?
HP-UX 11.31です。

> バッファリングしない(もしくは行単位でバッファリングする)プログラムを使うしか無いですね。
perlで以下のようなプログラムを挟むことで、バッファリングを回避してログ出力することができました。

exec | perl -ne '$|=1;while(<STDIN>){print if (length($_)<256);}' > server.log

(整形とは違いますが、面倒だったんで256文字以上は排除しました)
外部コマンドを使うのは少し抵抗があったんですが、やはりこのようなケースはCやperl等を利用するしかなさそうですね。
ありがとうございました。

補足日時:2011/12/14 09:35
    • good
    • 0
この回答へのお礼

教えてgooの操作になれておらず、補足に入力しておりました。すいません。

回答ありがとうございました。

お礼日時:2011/12/14 09:39

fold はバッファをコントロールするオプションがないみたいだね。


http://linuxjm.sourceforge.jp/html/GNU_textutils …

sed なら -u オプションでバッファを抑制できるよ。

[sed --help より抜粋]
| -u, --unbuffered
|   load minimal amounts of data from the input files and flush
|   the output buffers more often

exec | sed -nru '
:continue
/^.{0,256}$/{
p
d
}
h
s/^(.{256}).*$/\1/p
g
s/^.{256}(.*)$/\1/
b continue
' > server.log

この回答への補足

タイトルでも「bashで」と記述していたにも関わらず、使用しているシェルはPOSIXシェルでした。
大変申し訳ございません。。。

POSIXシェルにはsedにuオプションが無いようで(manで見る限り、他のバッファリングをコントロールするオプションも見当たらず…)いただいた回答を実現することが出来ませんでした。

補足日時:2011/12/13 19:15
    • good
    • 0
この回答へのお礼

教えてgooの操作になれておらず、補足に入力しておりました。すいません。

回答ありがとうございました。

お礼日時:2011/12/14 09:38

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!