Вопрос: Трой скрипт для записи внутри себя


Я знаком с использованием tee, и я знаю, что я могу просто записывать выходные данные с помощью

script.sh | tee file.log

Тем не менее, я хочу бесшовный интерфейс для пользователя. Есть ли способ, в рамках script.sh, запустить tee, как если бы это делалось, как указано выше? Внутри этого скрипта есть сотни эхо-сигналов и множество других сценариев, которые было бы сложно индивидуально добавить в файл.


2
2017-07-22 20:27


Источник




Ответы:


Решение 1: exec

Вы можете поместить команду exec в начале скрипта:

$ cat script1
#!/bin/bash
exec > >(tee file.log)
echo one
echo two

Ниже приведен пример запуска скрипта1:

$ bash script1
$ one
two

$

Обратите внимание, что приглашение оболочки возвращается до завершения вывода из сценария. Это связано с тем, что выход перешел на подпроцесс, и из-за капризов многозадачности он завершается в своем собственном расписании. По этой причине я предпочитаю второе решение, показанное ниже:

Решение 2: группировка

Вы можете поместить весь скрипт в группу оболочки, {...}, а затем перенаправить вывод из группы:

$ cat script2
#!/bin/bash
{
echo one
echo two
} | tee file.log

Это можно сделать для произвольно сложных скриптов. Просто положите { в начале и в начале } | tee file.log в конце.

Образец прогона выглядит так:

$ bash script2
one
two
$ 

Обратите внимание, что результат аккуратно завершается перед возвратом приглашения.


6
2017-07-22 21:26



Тройный подход работает хорошо, и теперь я его использую. Есть ли способ (используя дату) для отметки времени каждой строки также с этим подходом? - Brydon Gibson
@BrydonGibson Попробуйте: ... | while read -r line; do echo "$(date +%Y-%m-%d-%H:%M:%S)" "$line"; done | tee file.log - John1024
Это будет также timedamp stdout, не так ли? На данный момент я работаю над тройкой по именованной трубе, а затем использую подобный метод для вас. - Brydon Gibson
Обновите: создайте именованный канал, создайте цикл while (как ваш) в фоновом режиме, но вместо этого прочитайте его из именованного канала, затем запустите скрипт и введите файл. Фоновый цикл ждет вывода в канал, и сценарий работает без проблем. - Brydon Gibson