【问题标题】:collect output in bash before writing在编写之前在 bash 中收集输出
【发布时间】:2016-10-19 08:47:13
【问题描述】:

我遇到了以下问题:

我正在解析 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 停止它。如果我不通过管道输出,则输出正常。

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

【问题讨论】:

  • 可以是/dev/stdout是什么意思?怎么设置成/dev/stdout,为什么不让它正常输出呢?
  • 如果文件参数没有设置我做outPut=/dev/stdout
  • 您可能还想调整脚本中的缓冲。 linux.die.net/man/1/stdbuf

标签: bash redirect pipe output wait


【解决方案1】:

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

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得到了脚本的完整输出,而不是一个接一个的块。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-27
    • 2014-11-27
    • 2015-12-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多