2016-10-19 10 views
0

を書き込む前にはbashで出力を収集:私はbashスクリプトでファイルを解析し、このような出力形式を用意しております私は次の問題を持っている

:$場合

echo "Evaluation of data from $date" > $outPut 
printf "\n%s\t\t\t%s\t\t%s\n" "column1" "column2" "column3" >> $outPut 
printf '%*s\n' "${COLUMNS:-$(tput cols)}" '' | tr ' ' - >> $outPut 

cat $file | \ 
while read i; 
do 
    ... 
    printf "..." 
done >> $outPut 

それは正常に動作しますoutPutはファイルです。しかし、プログラムのパラメータに応じて、$ outputは/ dev/stdoutにすることができます。

以下

bash someprogram.bash --tostdout | less 

にIパイプの出力を以下には、ゼロ出力ですぐに始まる場合。しばらくするとすべてが見えますが、私がそうするとGが機能しなくなり、CTRL-Cで停止することができます。私はそれをパイプしない場合、出力が正常に動作します。

私が欲しいのは、出力を収集した後すぐにすべてを書き込む機能と、プログラムの終了を待つパイプです。

+0

「/ dev/stdout」とは何を意味していますか?あなたは '/ dev/stdout'にどのように設定していますか?単に出力するのはなぜですか? – 123

+0

ファイルパラメータが設定されていない場合、私は 'outPut =/dev/stdout'を実行します – mirokai

+0

あなたはおそらくあなたのスクリプトでバッファリングを調整したいでしょう。 https://linux.die.net/man/1/stdbuf –

答えて

0

私はそれがその後

tmpFile=$(mktemp -p /tmp) 
echo "Evaluation of data from $date" > $tmpFile 
printf "\n%s\t\t\t%s\t\t%s\n" "column1" "column2" "column3" >> $tmpFile 
printf '%*s\n' "${COLUMNS:-$(tput cols)}" '' | tr ' ' - >> $tmpFile 

cat $file | \ 
while read i; 
    do 
    ... 
    printf "..." 
done >> $tmpFile 

cat $tmpFile 
rm $tmpFile 

利点は少ないが、チャンクの後にスクリプトではなく、チャンクの完全な出力を得ることであるstdoutに一時ファイルや猫への最初の書き込みによって回避策を見つけました。

関連する問題