一次性追加檔案、輸出到螢幕並從 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並嘗試運行它。我的 Debian 附帶的支持這一點busybox,但我不知道你的是否會:

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

相關內容