Как перенаправить stderr и stdout в различные файлы и также отобразиться в терминале?

Все кроме одного релиза Mac OS X (теперь macOS) были сертифицированы как Unix Open Group, начиная с 10,5:

В любой момент времени страница Apple на сайте Open Group только перечисляет текущую версию macOS и иногда предыдущей версии, но все ссылки выше были однажды найдены через ту страницу.

Состояние OS X как сертифицированный Unix вызывается в технологическом резюме Unix Apple, которое также имеет другие хорошие технические биты в нем, которые помогут Вам сравнить его с другим UNIX® и подобными Unix системами.

Я контролирую страницу Apple на веб-сайте Open Group из-за популярности этого ответа, и я никогда не видел, что Лев обнаружился там. Ввод по абсолютному адресу вокруг с четкой схемой URL в ссылках выше также не поднимает скрытой страницы сертификации Льва. Andrew Josey, VP Standards & Certification Open Group спросили, существует ли недостающая сертификация, и он, кажется, подтвердил, что 10.7 Львов не были зарегистрированы как продукт UNIX 03.

31
10.01.2018, 16:22
4 ответа

Используйте tee команда следующим образом:

(cmd | tee stdout.log) 3>&1 1>&2 2>&3 | tee stderr.log

3>&1 1>&2 2>&3 то, как Вы подкачиваете stderr и stdout, потому что мишень может только принять stdout.

Смотрите на команду мишени Unix для более усовершенствованного использования перенаправлений tee.

39
27.01.2020, 19:38
  • 1
    хорошее решение. Там какой-либо путь состоит в том, чтобы получить cmd код выхода? –  turbanoff 19.06.2015, 19:56
  • 2
    @turbanoff cmd с (cmd ; echo >exit_code.txt $?). –  Parthian Shot 14.08.2015, 00:04

@dogbane, Спасибо.
Я нашел иначе также, который сохраняет обоих потоки приблизительно в порядке, поскольку они распечатать без перенаправления.

command 2> >(tee errlog | tee -a bothLog > /dev/tty ) | tee outlog | tee -a bothLog

Но это работает только с оболочками, который поддерживает замену процесса.

3
27.01.2020, 19:38

попробуйте это:

command 2>&1 | tee bothLog
-2
27.01.2020, 19:38
  • 1
    Привет vasile, это не отвечает на вопрос: упрямые потребности отдельные файлы для stdout и stderr, Ваше решение смешало бы обоих в том же потоке. –  Mat 01.11.2012, 12:45

Я думаю, регистрируясь stdout, и stderr в два различных файла является блестящей идеей. Разве это не делает журналы асинхронными? Таким образом, я испытал следующее:

  • stdout к "stdout.log" (как dogbane предложенный)
  • stderror к "stderr.log" (как dogbane предложенный)
  • весь вывод к "all.log" и
  • все еще смогите видеть вывод на дисплее (в отдельном терминале, хотя!)

((cmd | tee stdout.log) 3>&1 1>&2 2>&3 | tee stderr.log) &> all.log

в другом терминале

tail -f --sleep-interval=2 all.log
5
27.01.2020, 19:38
  • 1
    Разве не возможно направить stderr непосредственно к второму tty? Затем никакой файл журнала не требуется. –  Steven Lu 25.04.2013, 21:40
  • 2
    @StevenLu да, если Вы знаете имя и имеете разрешение записать во второй tty, который может быть сделан. легче –  Jasen 15.12.2015, 01:46
  • 3
    был бы &| tee all.log на конце команды вместо &> all.log –  Jasen 15.12.2015, 01:49
  • 4
    @Jasen: в 2-й раз я вижу &| .Я понимаю &>, |& также, но что делает &| средний в этом контексте? Я не мог найти подходящую ссылку синтаксиса, не в сети, даже не консультируясь с ударом "страницы руководства удара (1)"... Tx –  Cbhihe 07.02.2016, 18:25
  • 5
    @Cbhihe ответов насколько я могу сказать, что он ничего не делает, я означал говорить |& –  Jasen 07.02.2016, 21:05

Теги

Похожие вопросы