Eine Datei anhängen, auf dem Bildschirm ausgeben und von stderr umleiten – alles auf einmal, ohne tee

Eine Datei anhängen, auf dem Bildschirm ausgeben und von stderr umleiten – alles auf einmal, ohne tee

Ich führe einen time ddBefehl in einem Shell-Skript aus und möchte die Ergebnisse in eine Datei ausgeben und auf dem Bildschirm ausdrucken. Die Zeile, die ich derzeit ausführe, ist:

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

Allerdings bleibt mir dann eine leere Datei und es erfolgt keine Ausgabe auf dem Bildschirm. Was müsste ich tun, um alle drei Dinge zu tun?

Beachten Sie, dass ich dies in einem eingebetteten System mit einer Busybox-Installation ausführe, diebeinhaltet nichtteees handelt sich also nicht um ein Duplikat vondiese Frage.

Antwort1

Was Sie zeigen, funktioniert auf meinem System wie erwartet. Sind Sie sicher, dass Sie bashund nicht verwenden sh? Auf jeden Fall habe ich es mit dashund mit busybox's versucht shund da hat es auch funktioniert. In Ermangelung von ist die einzige Lösung meiner Meinung nach, nach Abschluss des Befehls teezu verwenden .cat $logfile

Eine andere Möglichkeit wäre, einen Link zu erstellen busyboxund teezu versuchen, diesen auszuführen. Das busyboxmit meinem Debian mitgelieferte unterstützt das, aber ich weiß nicht, ob Ihrs das tut:

ln -s /bin/busybox /bin/tee

Versuchen Sie dann, teenormal zu laufen.

Wenn Sie es wirklich nicht bekommen können tee, wäre Ihre einzige andere Option so etwas wie das hier:

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

Antwort2

teeSie können den Befehl verwenden . Hier habe ich die Befehle gruppiert timeund ddden Codeblock verwendet, sodass sie als einzelner Befehl behandelt werden und ihre Ausgabe problemlos verarbeitet werden kann.

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

Beachten Sie das ;am Ende des zweiten Befehls. Dies ist zwingend erforderlich, damit Codeblöcke funktionieren.

Falls Sie es nicht verwenden möchten, teedenken Sie vielleicht darüber nach

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

verwandte Informationen