一次性追加文件、输出到屏幕并从 stderr 重定向,无需 tee

一次性追加文件、输出到屏幕并从 stderr 重定向,无需 tee

我正在 shell 脚本中运行time dd命令,我想将结果输出到文件中,并将其打印在屏幕上。我当前正在运行的线路是:

(time dd of=$dest_filepath if=$src_filepath bs=$block_size count=$block_count) >> $log_file 2>&1 &

尽管这给我留下了一个空文件并且不会输出到屏幕。为了完成这三件事,我需要做什么?

请注意,我在安装了 Busybox 的嵌入式系统中运行它不包括tee所以这不是重复的这个问题

答案1

您所展示的内容在我的系统上按预期工作。您确定您正在使用bash而不是sh?无论如何,我尝试了 withdash和 with busybox's sh,它也在那里工作。在没有 的情况下tee,我认为唯一的解决方案是cat $logfile在命令完成后。

另一种可能性是创建一个链接到busybox调用tee并尝试运行它。busybox我的 Debian 附带的 支持这一点,但我不知道你的是否支持:

ln -s /bin/busybox /bin/tee

然后,尝试tee正常运行。

如果您确实无法获得tee,那么您唯一的其他选择将是这样的:

foo=$( ( time dd if="file1" of="file2" bs=12 count=5 ) 2>&1 &)
echo "$foo"
echo "$foo" >> logfile

答案2

您可以使用该tee命令。在这里,我对命令进行了分组timedd使用代码块,以便将它们视为单个命令,并且可以轻松处理它们的输出。

{ time dd of=$dest_filepath if=$src_filepath bs=$block_size count=$block_count; } 2>&1|tee $log_file

记下;第二个命令末尾的 。这是代码块正常工作所必需的。

如果你不想使用tee那么你可能会考虑这个

{ time dd of=$dest_filepath if=$src_filepath bs=$block_size count=$block_count; } 2>&1 &> $log_file;cat $log_file

相关内容