Как перенаправить прогресс dd в терминале в файл log.txt, но все равно отображать его на терминале во время процесса?

Вот мой сценарий:

sudo mate-terminal --geometry=50x10 -x sh -c "dd if=/dev/sda of=/dev/sdb status=progress 2>&1 | tee log.txt | md5sum > hash.txt | sha1sum > hash1.txt"

Я видел людей, дающих это предложение все время; положить 2> и 1. Но это только отобразит прогресс в файле log.txt, а терминал ничего не отобразит. Вот изображение того, как выглядит прогресс в файле log.txt.

Если я удалю 2>&1 и просто идти с

command | tee log.txt

Только терминал покажет прогресс, и ничего не будет отображаться в log.txt файл

Я также попробовал:-

(command 2>&1) | log.txt

command 2> | log.txt

и многое другое я не могу вспомнить. Так может кто-нибудь мне помочь?

2 ответа

Прогресс выводится в STDERR, а не в STDOUT. Вы можете получить что-то вроде того, что вы хотите, делая tail -f на файл записывается так:

mate-terminal --geometry=50x10 -x sh -c 'tail -f log.txt'
sudo dd if=/dev/sda of=/dev/sdb status=progress 2> log.txt"

tail -f log.txt напечатает все, что написано log.txt к новому меньшему терминалу и запустите его как фоновый процесс, чтобы вы могли выдавать больше команд во время его работы.
2> отправляет поток STDERR log.txt, Если есть какой-либо вывод в STDOUT, он будет отображаться в терминале, из которого запускается команда или скрипт.

Перенаправить как stderr, так и stdout с помощью |& в bash:

sudo mate-terminal --geometry=50x10 -x bash -c "dd if=/dev/sda of=/dev/sdb status=progress |& tee log.txt"
Другие вопросы по тегам