4

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

script.sh | tee file.log

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

1 ответ1

8

Решение 1: Exec

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

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

Вот пример запуска script1:

$ bash script1
$ one
two

$

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

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

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

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

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

Примерный прогон выглядит так:

$ bash script2
one
two
$ 

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .