在写入之前收集 bash 中的输出

collect output in bash before writing

我遇到了以下问题:

我正在 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.

如果我将输出通过管道传递给 less

bash someprogram.bash --tostdout | less

less 立即以零输出开始。过了一会儿我看到了一切,但如果我这样做了 :G less 就会停止工作,我只能用 CTRL-C 来停止它。如果我不通过管道传输它,输出工作正常。

我想要的是:收集输出后立即写入所有内容的功能+等待我的程序完成的管道。

我找到了一个解决方法,首先写入一个临时文件,然后将其 cat 到标准输出

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

优点是 less 得到脚本的完整输出,而不是一个接一个地输出。