У меня есть сценарий bash с большим количеством выходных данных, и я хотел бы изменить этот сценарий (не создавать новый), чтобы скопировать весь вывод в файл, как это было бы, если бы я передавал его через тройник.
У меня есть файл script.sh :
#!/bin/bash
init
do_something_that_outputs_stuff_to_STDOUT
launch_applications_that_output_to_STDOUT
fini
и я хотел бы сделать копию STDOUT в файл script.log без необходимости ./script.sh | tee script.log
каждый раз печатать .
Спасибо том
Ответы:
Я не мог заставить работать очень простую однострочную версию Денниса, так что вот гораздо более запутанный метод. Я бы попробовал его первым.
Как уже упоминалось, вы можете использовать exec для перенаправления стандартной ошибки и стандартной ошибки для всего сценария.
exec > $LOGFILE 2>&1
Примерно так: Это выведет все stderr и stdout в $ LOGFILE.Теперь, так как вы хотите, чтобы это отображалось на консоли, а также в лог-файле, вам также придется использовать именованный канал для exec для записи и tee для чтения.
(Однострочник Денниса технически тоже делает это, хотя, очевидно, по-другому). Сама труба создается с помощью
mkfifo $PIPEFILE
. Затем сделайте следующее.Если вы хотите быть тщательным, вы можете создать и уничтожить файл именованного канала в начале и конце вашего скрипта.
Для справки, я почерпнул большую часть этого из очень информативного поста в блоге случайного парня: ( Архивная версия )
источник
Просто добавьте это в начало вашего скрипта:
Это добавит все выходные данные, отправленные на стандартный вывод, в файл
script.log
, оставив прежнее содержимое на месте. Если вы хотите начинать заново каждый раз, когда запускается скрипт, просто добавьтеrm script.log
прямо перед этойexec
командой или удалите ее-a
изtee
команды.-i
Опция заставляетtee
игнорировать сигнал прерывания и может позволить ,tee
чтобы поймать более полный набор выходной.Добавьте эту строку, чтобы также отлавливать все ошибки (в отдельном файле):
Пробелы между несколькими
>
символами важны.источник
Это комбинированная версия ответа, опубликованного Деннисом Уильямсоном ранее. Добавляет оба err & std в script.log в правильном порядке.
Добавьте эту строку в начало вашего скрипта:
Обратите внимание на пространство между
>
знаками. У меня работает на GNU bash, версия 3.2.25 (1) -релиз (x86_64-redhat-linux-gnu)источник
Я полагаю, что другой подход выглядит примерно так:
источник
Если вам нужна копия вывода, вы можете использовать
tee
этот способ:Тем не менее, это будет регистрировать только стандартный вывод в script.log. Если вы хотите убедиться, что и stderr, и stdout перенаправлены, используйте:
Вы могли бы даже сделать это немного лучше с небольшой функцией:
источник
2>&1
и просто отправил трубку в тройник.Вы бы просто использовали это:
Это выводит все в этот журнал, все, а также отображает его на экране. Если вы хотите ПОЛНЫЙ вывод, это как это сделать.
И затем вы можете повторить сценарий, если вы ленивы.
источник
script
это пакет, например.sudo apt-get install script
чтобы установить его на дистрибутивы со вкусом Debian , дополнительноscript -ac 'command opts' ~/Documents/some_log.script
можно просмотреть в терминале что-то вродеstrings ~/Documents/some_log.script | more
;strings
быть простым способом предварительной дезинфекции некоторых вещей, которыеscript
вводят, чтобы позволить более изощренные методы повторного воспроизведения / просмотра. В противном случае твердый ответ @Phishy, потому чтоscript
также сохраняет интерактивные вещи тоже.Вы можете узнать больше о том, как это работает, здесь: http://www.xaprb.com/blog/2006/06/06/what-does-devnull-21-mean/
источник
tee
.