Добавить файл, вывести на экран и перенаправить из stderr — всё одновременно, без tee

Добавить файл, вывести на экран и перенаправить из stderr — всё одновременно, без tee

Я запускаю 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? В любом случае, я пробовал с dashи с busybox's sh, и это сработало там тоже. При отсутствии tee, я думаю, единственным решением будет cat $logfileпосле завершения команды.

Другой возможностью было бы сделать ссылку на busyboxcalled 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команду. Здесь я сгруппировал команды timeи ddиспользую блок кода, чтобы они воспринимались как одна команда, а их вывод можно было легко обработать.

{ 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

Связанный контент