Make Make - Как подавить сообщения об ошибках, не подавляя другой выход

Я нашел решение после небольшого поиска.

Проблема возникает из-за того, что inotifywait превращается в подоболочку, как указано в комментариях @mikeserv.

Поэтому мне пришлось написать для него метод очистки. Мой сценарий:

#!/bin/bash
#
#
# script for immediatly changing the owner and group of the let's encrypt challenge file in the given webroot

Pidfile="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"/run-file-chowner.pid
echo $$ > $Pidfile

function terminate_process () {
        trap - SIGHUP SIGINT SIGTERM SIGQUIT
        printf "\nTerminating process...\n"
        rm "$Pidfile" > /dev/null 2>&1;
        kill -- -$$
        exit $1
}

function main () {

trap terminate_process SIGHUP SIGINT SIGTERM SIGQUIT

local OPTIND D opt

while getopts D: opt;
do
        case $opt in
        D)
                Domain=$OPTARG;;
        esac
done

shift $((OPTIND-1))

case $Domain in
        'domain-b.com')
                VHost="doma-www"
        ;;
        'domain-a.com')
                VHost="domb-www"
        ;;
        *)
                printf "\nScript usage : [ $0 -D \"example.com\" ]\n\n"
                exit 1;
        ;;
esac

WebPath=/var/www/$Domain/$VHost/htdocs/public/.well-known/acme-challenge

inotifywait -m $WebPath | while read -r dir event name; do
        case $event in
        CREATE)
                chown $VHost:$VHost $WebPath/$name
                printf "\nOwner and group of \"$name\" were changed to $VHost...\n"
        ;;
        DELETE)
                printf "\nThe file \"$name\" was deleted\n"
                terminate_process 0
        ;;
        *)
                printf "\nEvent $event was triggered.\n"
        ;;
        esac
done
}

main "$@"

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

root #: bash file-chowner -D dom-a.com
Setting up watches.
Watches established.

Owner and group of "test" were changed to doma-www...

Event OPEN was triggered.

Event ATTRIB was triggered.

Event CLOSE_WRITE,CLOSE was triggered.

Event ATTRIB was triggered.

The file "test" was deleted

Terminating process...
Terminated

Terminating process...
Terminated
2
05.08.2018, 10:39
1 ответ

Поскольку ваша система представляет собой оболочку make, я предполагаю, что она генерирует make-файл. Настройте ваш генератор, чтобы добавить 2>&3ко всем командам оболочки в make-файле, и заставьте вашу программу перенаправлять файловый дескриптор 3 на стандартную ошибку (, файловый дескриптор 2 )и файловый дескриптор 2 на /dev/null. Таким образом, сама программа make будет печатать свою стандартную ошибку, которая соответствует /dev/null, а команды сборки будут печатать свою стандартную ошибку, которая соответствует стандартной ошибке оболочки.

Если вы используете написанный от руки make-файл, вы можете преобразовать его, чтобы добавить эти перенаправления, при условии, что make-файл не слишком запутан с синтаксисом (, например. нет причудливых макросов GNU, которые генерируют команды ). Для каждой строки, которая начинается с табуляции и (необязательно) @или -и где предыдущая строка не заканчивается обратной косой чертой, добавьте exec 2>&3;после табуляции и необязательно @-.

Вместо изменения make-файлавы можете вызвать его с аргументом SHELL=/path/to/shell_wrapper, где shell_wrapperвыполняет свой аргумент со стандартной ошибкой, перенаправленной на другой дескриптор, что-то вроде этого:

#!/bin/sh
eval "$2" 2>&3
4
27.01.2020, 22:09

Теги

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