Отформатируйте журналы, чтобы добавить несколько строк, только если есть ошибка

[Пожалуйста, внимательно прочитайте комментарии, сопровождающие ваш вопрос, так как, похоже, вы не все делаете правильно с sudo]

В bash есть механизм под названием "подстановка истории", который включается в командной строке. Он позволяет вам вставить всю или часть предыдущей команды (отсюда и "история") в редактируемую команду.

Символ, запускающий подстановку истории, - ! . Например, !WORD заменяется последней командой, начинающейся с WORD. Если такой команды нет, bash выдаст сообщение об ошибке, которое вы получили: bash: !WORD: событие не найдено.

Если вам нужно набрать ! без активации механизма подстановки истории, вы должны либо экранировать его \! или заключить его в одинарные кавычки '!'.

Например: echo 'Пользователь ALL = NOPASSWD: ALL, !/bin/su' | ...

Если расширение истории не дает вам покоя, вы также можете отключить его с помощью set +H, набирать команды без кавычек ! , и снова включить его позже с помощью set -H.

1
28.08.2017, 13:22
2 ответа

В findдобавлен аргумент non_existent_dirдля генерации сообщения об ошибке.

С переменной

#!/bin/bash

error=$(find. non_existent_dir 2>&1 > output.txt)
if (($?)); then
     printf "%s\n%s\n%s\n" "message before" "$error" "message after" >> log.txt
fi

Пояснение:

  • 2>&1 > output.txt-stderr(номер 2 )перенаправлен наstdout(номер 1 )и stdoutна номер output.txt.

  • $?-статус завершения команды find. findзавершается со статусом 0, если все файлы обработаны успешно, и больше 0, если возникают ошибки.

Без переменной

find. non_existent_dir 2>&1 > output.txt | 
  awk 'NR == 1 {print "start message"}
       {print}
       END {if(NR > 0) print "end message"}' >> log.txt

Пояснение:

  1. Часть findтакая же, как и в предыдущем варианте.
  2. awkчасть -Если ввод не содержит строк (ошибок не было ), он ничего не напечатает.
    • NR == 1 {print "start message"}-если это первая строка, вывести "стартовое сообщение".
    • {print}-просто напечатайте все входные строки.
    • END {if(NR > 0) print "end message"}-проверка в конце выполнения, были ли получены какие-либо строки из ввода(NR-количество записей )? Если это так, напечатайте «конечное сообщение».
2
27.01.2020, 23:33

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

function append()
{
if [[ -s /tmp/stderr ]]
then 
     {   echo -e '\nText you want like ***\n' >> log.txt
         cat /tmp/stderr >> log.txt;
         rm /tmp/stderr
     }
fi
}

Затем выполните команду следующим образом:

$ find /some_dir -maxdepth 1 -mindepth 1 > outputFile.txt 2>/tmp/stderr;
$ append
1
27.01.2020, 23:33

Теги

Похожие вопросы