Как собрать логи и выходные данные из программы и передать их в параметр функции - PullRequest
3 голосов
/ 01 июля 2019

У меня есть сценарий оболочки, который имеет функцию для записи операторов

#!/bin/sh

Log() {
    echo $1 >> /some/logfile
}

Log "Test logging works"

Это прекрасно работает!

Далее, у меня есть программа, которая записывает операторы, и если я хочу иметьлоги оттуда добавлены в файл, я могу сделать так

SomeProgram >> SomeFile.txt

Это также прекрасно работает!

Но что, если я хочу передать логи из SomeProgram в мою функциюLog при вызове SomeProgram из того же сценария оболочки.Это возможно?Ниже приведены некоторые уловки, которые я пробовал, но они не сработали.

Log "SomeProgram >> SomeFile.txt"
Log(SomeProgram >> SomeFile.txt)

Вопрос
Итак, как мне собрать журналы из программы и продолжать передавать их в параметрфункция?

Среда:
Linux

Ответы [ 3 ]

2 голосов
/ 01 июля 2019

Если это единичный случай, я бы написал цикл.

SomeProgram | while IFS= read -r line; do
    Log "$line"
done

Если вы собираетесь делать это много, вы можете добавить второй режим к Log, где он читает из стандартного ввода вместо своих аргументов.

Log() {
    case $1 in
        --stdin)
            while IFS= read -r line; do Log -- "$line"; done
            return;;

        --)
            shift;;
    esac

    echo "$*" >> /some/logfile
done
SomeProgram | Log --stdin

Не проверять, является ли stdin tty ! Это приведет к тому, что Log() будет использовать stdin каждый раз, когда ваш скрипт вызывается неинтерактивно. Хорошие сценарии ведут себя хорошо, когда автоматизированы и используются в конвейерах; они не настаивают на вводе с клавиатуры.

1 голос
/ 01 июля 2019

Вы можете написать функцию, которая будет обрабатывать стандартный ввод, а также любые аргументы:

Log() {
  # if STDIN (0) is not a terminal, iterate over any lines of standard input
  [[ ! -t 0 ]] && while read line; do echo "$line" >> /some/logfile; done

  # iterate over any arguments provided
  for arg; do echo "$arg" >> /some/logfile; done
}

Если у вас есть программа, которая будет непрерывно выводить строки текста, вы можете передать | стандарт этой программывыводить на стандартный ввод вашей функции, передавать ей аргументы вручную или и то, и другое!

SomeProgram | Log
Log "line one" "line two"
SomeProgram | Log "additional line one" "additional line two"

Проверьте man bash, /^ *Compound Commands для всех типов синтаксиса, которые будут работать с функциями.

0 голосов
/ 01 июля 2019

используйте tee для разделения вывода

Log "$(SomeProgram | tee -a SomeFile.txt)"

Объяснение:

SomeProgram | tee передать вывод stdio из SomeProgram в команду tee

tee -a SomeFile.txt будет выводить в stdio и в то же время -a add to SomeFile.txt

Log "$(......)" будет захватывать stdio команд в скобках и передавать результат в качестве параметра функции Log.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...