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

1748
Brydon Gibson

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

script.sh | tee file.log 

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

2

1 ответ на вопрос

6
John1024

Решение 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 $  

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

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