Как распечатать сценарий оболочки stdout / stderr в файл / ы и консоль - PullRequest
3 голосов
/ 07 августа 2020

В сценарии bash я использую следующий синтаксис, который я приказываю распечатать все от сценария до файлов: $file и $sec_file

мы запускаем сценарий на нашем Linux rhel сервер - версия 7.8

exec > >(tee -a "$file" >>"$sec_file") 2>&1

поэтому после завершения сценария bash мы получаем в обоих файлах содержимое stdout/stderr каждой строки в сценарии bash

теперь мы хотим дополнительно для вывода на консоль stdout/stderr, а не только для файлов

Я буду признателен за любое предложение

Пример сценария:

# more  /tmp/script.bash

#!/bin/bash

file=/tmp/file.txt
sec_file=/tmp/sec_file.txt

exec > >(tee -a "$file" >>"$sec_file") 2>&1

echo "hello world , we are very happy to stay here "

Пример того, как для запуска сценария:

/tmp/script.bash

<--  no output from the script -->

# more /tmp/file.txt
hello world , we are very happy to stay here
# more /tmp/sec_file.txt
hello world , we are very happy to stay here

пример ожидаемого результата, который должен быть следующим:

/tmp/script.bash
hello world , we are very happy to stay here

и

# more /tmp/file.txt
hello world , we are very happy to stay here
# more /tmp/sec_file.txt
hello world , we are very happy to stay here

Ответы [ 2 ]

0 голосов
/ 07 августа 2020

Я бы посоветовал просто записать консольные вещи в новый канал вывода:

#!/bin/bash
file=file.txt
sec_file=sec_file.txt

exec 4>&1 > >(tee -a "$file" >>"$sec_file") 2>&1

echo "stdout"
echo "stderr" >&2
echo "to the console" >&4

Вывод:

me@pc:~/⟫ ./script.sh 
to the console
me@pc:~/⟫ cat file.txt 
stdout
stderr
me@pc:~/⟫ cat sec_file.txt 
stdout
stderr

Если хотите, вы можете сделать это и даже снова написать в stderr с >&5:

exec 4>&1 5>&1 > >(tee -a "$file" >>"$sec_file") 2>&1
echo "stderr to console" >&5

Изменить: Изменено &3 на &4, поскольку &3 иногда используется для стандартного ввода.

Но, возможно, настал момент переосмыслить то, что вы выполняете и сохраняете &1 stdout и &2 stderr и используете &4 и &5 для записи в файл?

exec 4> >(tee -a "$file" >>"$sec_file") 5>&1

Это требует от вас добавления ко всем строкам, которые должны закончиться в вашем файле, чтобы добавить >&4 2>&5

0 голосов
/ 07 августа 2020

Думаю, проще всего просто добавить несколько файлов в качестве аргументов к tee, вот так:

% python3 -c 'import sys; print("to stdout"); print("to stderr", file=sys.stderr)' 2>&1 | tee -a /tmp/file.txt /tmp/file_sec.txt
to stdout
to stderr
% cat /tmp/file.txt 
to stdout
to stderr
% cat /tmp/file_sec.txt 
to stdout
to stderr

Тогда ваш сценарий будет выглядеть так:

#!/bin/bash

file=/tmp/file.txt
sec_file=/tmp/sec_file.txt

exec > >(tee -a "$file" "$sec_file") 2>&1

echo "hello world , we are very happy to stay here "
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...