В оболочке Unix у меня есть файл env (файл env определяет параметры, необходимые для запуска пользовательского скрипта, такие как имя файла журнала и путь, перенаправление выходных данных и ошибок в файл журнала, сведения о подключении к базе данных и т. Д. ), Который перенаправляет все выходы ( эхо-сообщения ) и ошибки в файл журнала из выполненного скрипта, используя следующий код:
exec 1>>${LOG_FILE}
exec 2>>${LOG_FILE}
Файл env выполняется в начале каждого скрипта. Из-за приведенного выше кода в файле env все выходы консоли, которые могут быть пользовательскими выходами или ошибками, напрямую выводятся в файл журнала, что мне действительно нужно.
Но есть некоторые выборочные пользовательские выходные данные, которые я хочу отображать как в консоли, так и в файле журнала. Но из-за приведенного выше кода я не могу этого сделать.
Я знаю, что если я удалю приведенный выше код, я могу получить желаемый результат для этого случая, но мне придется вручную записывать все остальные выходные данные в файл журнала, что является непростой задачей.
Есть ли способ получить вывод как в консоли, так и в файле журнала, не удаляя приведенные выше коды?
/dev/fd/3
имя файла, которое относится к «текущему открытому fd 3», поэтомуtee /dev/fd/3
все, что приходит на его stdin , будет записываться в fd 1, а также на fd 3 (/dev/fd/3
файл). Fd 1 подключен к файлу журнала, fd 3 подключен к консоли.echo "blah" | tee file1.txt | tee file2.txt >/dev/null
«Blah» не будет помещаться в file1.txt и file2.txt, но не записывается в консоль.tee
, который, в свою очередь, пишет на терминал), а не напрямую на терминал, и корректировать свой вывод для соответствия.Да, вы хотите использовать
tee
:Просто передайте свою команду tee и передайте файл в качестве аргумента, например:
При этом вывод выводится в STDOUT и тот же вывод записывается в файл журнала. См.
man tee
Дополнительную информацию.Обратите внимание, что это не будет записывать stderr в файл журнала, поэтому, если вы хотите объединить два потока, используйте:
источник
script.sh: line 5: exec: 1: not found
Я попробовал ответить Джунти, но я также получил
ошибка. Это то, что лучше всего работает для меня ( подтверждено также, что работает в zsh):
Затем файл /tmp/both.log содержит
/Tmp/both.log добавляется, если вы не удалите -a из tee.
Подсказка:
>(...)
это подмена процесса. Это позволяетexec
вtee
команде , как если бы это был файл.источник
exec > >(tee ${LOG_FILE}) 2>&1
.Я хотел отображать журналы на stdout и файл журнала вместе с меткой времени. Ни один из приведенных выше ответов не помог мне. Я использовал подстановку процесса и команду exec и придумал следующий код. Примеры журналов:
Добавьте следующие строки вверху вашего скрипта:
Надеюсь, это кому-то поможет!
источник
для файла журнала вы можете указать дату, чтобы ввести текстовые данные. следующий код может помочь
output: 2. Файл журнала будет создан при первом запуске и будет обновляться при следующих запусках. Если файл журнала отсутствует при следующем запуске, сценарий создаст новый файл журнала.
источник
Я нашел способ получить желаемый результат. Хотя это может быть несколько неортодоксальный способ. В любом случае, вот оно. В файле redir.env у меня есть следующий код:
Затем в реальном сценарии у меня есть следующие коды:
Здесь эхо выходы только на консоль, журнал выводит только файл журнала и сообщение результатов как для файла журнала и консоли.
После выполнения вышеуказанного файла сценария я получаю следующие результаты:
В консоли
Для файла журнала
Надеюсь на эту помощь.
источник
Попробуйте это, он сделает свою работу:
источник
exec > >(tee -a ${log_file} )
идеально подходит для моих нужд. Предыдущие решения, приведенные выше, прерывали бы части моего скрипта, которые принудительно завершали работу в случае сбоя. Спасибоисточник
Я считаю очень полезным добавлять в файл журнала и stdout, и stderr. Я был рад увидеть решение от alfonx с
exec > >(tee -a)
, потому что мне было интересно, как это сделать, используяexec
. Я наткнулся на творческое решение с использованием синтаксиса here-doc и.
: /unix/80707/how-to-output-text-to-both-screen-and-file-inside-a-shell -скриптЯ обнаружил, что в zsh решение here-doc можно изменить с помощью конструкции multios для копирования вывода как в stdout / stderr, так и в файл журнала:
Он не так удобочитаем, как
exec
решение, но имеет то преимущество, что позволяет вам регистрировать только часть скрипта. Конечно, если вы опустите EOF, тогда весь скрипт будет выполняться с логированием. Я не уверен, какzsh
реализует multios, но у него может быть меньше накладных расходов, чем уtee
. К сожалению, кажется, что нельзя использовать multios сexec
.источник