ファイルを追加し、画面に出力し、stderrからリダイレクトする、すべて一度に、teeなしで

ファイルを追加し、画面に出力し、stderrからリダイレクトする、すべて一度に、teeなしで

シェル スクリプトでコマンドを実行していてtime dd、その結果をファイルに出力し、画面に表示したいと考えています。現在実行している行は次のとおりです。

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

ただし、空のファイルが残り、画面には出力されません。これら 3 つのことすべてを実行するには、何をする必要がありますか?

私はBusyboxをインストールした組み込みシステムでこれを実行しています。含まれていませんteeこれは重複ではありませんこの質問

答え1

あなたが示しているものは、私のシステムでは期待通りに動作します。 ではbashなく を使用していますかsh? いずれにしても、dashと をbusyboxで試してみたshところ、そこでも動作しました。 がない場合、唯一の解決策は、コマンドの終了後にteeを実行することだと思います。cat $logfile

busyboxもう一つの可能​​性は、へのリンクを作成してtee、それを実行してみることです。busybox私の Debian に付属していた はそれをサポートしていますが、あなたの 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

;2 番目のコマンドの末尾にある をメモします。これは、コード ブロックが機能するために必須です。

使用したくない場合はtee、これについて考えてみてください

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

関連情報