LINUX.ORG.RU

Передать вывод программы как аргумент в функцию

 


1

1

Есть функция-логгер для записи событий скрипта в файл:

logwriter()
 {
   loglevel=$1
   textlog=$2
   if [ -z "$loglevel" ]; then $loglevel="INFO"; fi
   if [ -z "$textlog" ]
     then
         echo "$DATE_NOW [$loglevel] :: ~empty~" >> $LOG_FILE
     else
      echo "$DATE_NOW [$loglevel] :: $textlog" >> $LOG_FILE
   fi
 }

Как можно ей передать вывод команды rsync как $2 аргумент? Вопрос может быть и глупый, но только начинаю изучать Bash...



Последнее исправление: FluffyPillow (всего исправлений: 1)
Ответ на: комментарий от ionanahin

Я имел ввиду, что нужно передать результат работы rsync (стандартный вывод) в функцию logwritter под видом второго аргумента для этой функции.

FluffyPillow
() автор топика
Ответ на: комментарий от FluffyPillow

logwriter "первый аргумент" $(rsync ...)

anonymous
()
logwriter NOTICE "$(rsync blah bleh)"

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

logwriter()
{
  exec >> $LOG_FILE
  local DATE_NOW=$(LANG=C date)
  local loglevel=$1
  local empty=true
  if [ -z "$loglevel" ]; then loglevel="INFO"; fi
  while read textlog; do
    empty=false
    echo "$DATE_NOW [$loglevel] :: $textlog"
  done
  if [ "$empty" == "true" ]; then
    echo "$DATE_NOW [$loglevel] :: ~empty~"
  fi
}
rsync foo bar| logwriter WARNING
legolegs ★★★★★
()
Ответ на: комментарий от legolegs

Вместо:

local loglevel=$1
if [ -z "$loglevel" ]; then loglevel="INFO"; fi

Следовало бы:

local loglevel=${1:-INFO}

Для определения того есть ли что на STDIN, можно использовать простую проверку: https://stackoverflow.com/questions/2456750/detect-presence-of-stdin-contents...

DRVTiny ★★★★★
()
Ответ на: комментарий от DRVTiny

Первое принимается, второе нет. Если в stdin сейчас нет данных это не значит, что их не появится в будущем. Например, если программа-источник тормозит (как du -s) или это вообще ввод с терминала. А если получен EOF (и read вышел с ненулём) - всё значит всё.

legolegs ★★★★★
()
Ответ на: комментарий от legolegs

Первое принимается,

Присваивание в local var=val - bash-изм на пустом месте.

второе нет. Если в stdin сейчас нет данных это не значит, что их не появится в будущем.

Тогда date надо делать внутри цикла.

И, кстати, не надо извращаться с exec, определение функции с редиректом делает это нагляднее.

Итого:


logwriter()
{
  local loglevel textlog out
  loglevel=${1:-INFO}
  while read textlog; do
        out=$(LANG=C date)
        echo "$out  [$loglevel] :: $textlog"
  done
  [ -z "$out" ] && echo "$(LANG=C date) [$loglevel] :: ~empty~"
} >> $LOG_FILE

echo warn foo bar| logwriter WARNING
echo info | logwriter
echo | logwriter ERROR
logwriter EOF
vodz ★★★★★
()
Последнее исправление: vodz (всего исправлений: 1)
Ответ на: комментарий от legolegs

Например, если программа-источник тормозит (как du -s) или это вообще ввод с терминала

Да ладно?

[blabla]$ { sleep 5; echo bye; } | f
bye
[blabla]$ declare -f f
f () 
{ 
    { 
        [[ -t 0 ]] && echo hello
    } || cat -
}

DRVTiny ★★★★★
()
Ответ на: комментарий от DRVTiny

Да это вообще не в тему. То, что ты запостил - это определние, что stdin - это терминал, а не файли или пайп. У топикстартера эта задача не стояла вообще. А стояла - печатать в лог «~empty~» если программулина ничего не вывела. А про это тоже в том посте на стопкопереполнении есть - read -t0 var, но это ненадёжно.

legolegs ★★★★★
()
Ответ на: комментарий от vodz

определение функции с редиректом делает это нагляднее.

Вот про это не знал, действительно так понятнее. Хотя exec без параметров тоже клёвый.

legolegs ★★★★★
()
Ответ на: комментарий от legolegs

Хотя exec без параметров тоже клёвый.

Не, тут надо понимать, что exec внутри функции всё равно глобальный, а не только для этой функции, потому клёвость никакая. Самое правильное - в скрипте один раз вызвать exec с указанием номера дискриптора, а потом уже вызывать функцию с записью в этот дескриптор. Тогда и exec будет как и положено разовый в скрипте, и файл открываться однократно.

vodz ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.