重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

【GOLF me!】初月無料お試し

結果を標準出力に出すシェルスクリプトを、">"で出力先をファイルにリダイレクトして動かすと、(時間のかかる処理の間に出力ファイルサイズを見ると)増えていくはずのファイルサイズが途中で減ることがあります。
シェルスクリプト内には、csvファイルを1行読み込んでは整形出力するループ処理のrubyスクリプトがあり、ループの中、及びループの前後に標準出力があります。
シェルスクリプト内の複数のコマンド標準出力はスクリプトが終了するまで1つの書き出しになると思っていますが、いったんクローズされて次の書き込みと扱われる場合があるのでしょうか?

質問者からの補足コメント

  • うーん・・・

    問題としているスクリプトの構造を単純化したものとして、次のスクリプトを走らせると
    出力ファイルには最後に実行された結果しか記録されていませんでした。
    hoge.rb出力リダイレクトを ">>" にするとすべて記録されていました。
    どういう場合に、実行中のスクリプトの標準出力が閉じられるのでしょうか?

    (foo.sh)
    #!/bin/bash
    for i in 1 2 3 4 5 ; do
    ruby hoge.rb $i > hoge-out.txt
    done


    (hoge.rb)
    #!/usr/bin/env ruby
    puts ARGV[0]

      補足日時:2018/08/19 15:40

A 回答 (11件中11~11件)

書き込もうとするファイルがずっと開きっぱなし何て思ってませんよね。


書き込みを行う都度開き直しますよ。

てか、追加書き込みするのに「>」は無いと思う。
使うのは「>>」です。

「>」では新規に上書きしますので、前のデータは残りません。
これがファイルサイズが減っているカラクリということはありませんか?
(前のデータよりも小さいデータを上書きしている)
    • good
    • 0
この回答へのお礼

銀鱗様、ありがとうございます。

次のスクリプトtmp.shでは、standard-out-from-tmp2sh.txtにtmp2.shの2つのlsコマンドの結果が書き込まれます。
これは違う事情なのでしょうか?

(tmp.sh)
#!/bin/bash
ScriptName=$(basename $0)
tmp2.sh > standard-out-from-tmp2sh.txt

(tmp2.sh)
#!/bin/bash
ls | sed ''
ls | sed 's/^/HI/'

お礼日時:2018/08/18 21:18

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