URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 10236
[ Назад ]

Исходное сообщение
"Правка конфига nginx и отображение причины ошибки"

Отправлено universite , 01-Авг-18 00:36 
Имею небольшой скрипт который генерит специфический конфиг (${file1267_conf}).


# проверяем новые конфиг нгинкс, если ошибка, то выключаем генерируемый конфиг и требуем разобраться
nginx -t && service nginx reload || (
    mv ${file1267_conf} ${file1267_conf}.${bad_ending}
    nginx -t && service nginx reload || echo "Nginx config error!"
    )

В логи попадает только текст "Nginx config error!"
Как бы в output генерить ругань проверки конфига от nginx.


Содержание

Сообщения в этом обсуждении
"Правка конфига nginx и отображение причины ошибки"
Отправлено Andrey Mitrofanov , 01-Авг-18 09:38 
> Имею небольшой скрипт который генерит специфический конфиг (${file1267_conf}).

 { 

> # проверяем новые конфиг нгинкс, если ошибка, то выключаем генерируемый конфиг и
> требуем разобраться
> nginx -t && service nginx reload || (
>  mv ${file1267_conf} ${file1267_conf}.${bad_ending}
>  nginx -t && service nginx reload || echo "Nginx config error!"
>  )  

 } 2>&1 

> В логи попадает только текст "Nginx config error!"
> Как бы в output генерить ругань проверки конфига от nginx.

"Правка конфига nginx и отображение причины ошибки"
Отправлено universite , 01-Авг-18 13:35 
>[оверквотинг удален]
>
 { 

>> # проверяем новые конфиг нгинкс, если ошибка, то выключаем генерируемый конфиг и
>> требуем разобраться
>> nginx -t && service nginx reload || (
>>  mv ${file1267_conf} ${file1267_conf}.${bad_ending}
>>  nginx -t && service nginx reload || echo "Nginx config error!"
>>  )
>
 } 2>&1 

>> В логи попадает только текст "Nginx config error!"
>> Как бы в output генерить ругань проверки конфига от nginx.

Все равно не понятно, зачем использовать секцию

 { } 2>&1 


"Правка конфига nginx и отображение причины ошибки"
Отправлено Andrey Mitrofanov , 01-Авг-18 14:13 
>>
 } 2>&1 

>>> В логи попадает только текст "Nginx config error!"
>>> Как бы в output генерить ругань проверки конфига от nginx.
> Все равно не понятно, зачем использовать секцию
 { } 2>&1 

По "в логи попадает только echo" я предположил, что:
1/ в логи попадает вывод на STDOUT
2/ "ругань проверки конфига" не попадает в STDOUT потому, что "идёт" на STDERR

Чтобы "положить" предполагаемый STDERR в "работающий" STDOUT, а предложил [попробовать] перенаправление ' 2>&1 '.

Чтобы не искать, вывод которой из кучи команд предположительно в том STDERR, я "взял" STDERR их всех, обернув "секцией"  ' { ... } '.

Всё это предположения, всё это писать длинно.  И, как выяснилось, непонятно.  Прошу прощения за то, что написал первое сообщение на непонятном Вам языке bash.


"Правка конфига nginx и отображение причины ошибки"
Отправлено universite , 01-Авг-18 19:57 
Началось...

Я вот не сильно понимаю разницу между ( ) и { }.

Возможно вы знаете какие-то особенности использования { } внутри ( ) ?

Это имели ввиду?


(
...
{ nginx -t && service nginx reload || echo "Nginx config error!" } 2>&1
...
)


Но тогда имеем:

test4.sh: 27: Syntax error: ")" unexpected (expecting "}")


"Правка конфига nginx и отображение причины ошибки"
Отправлено Andrey Mitrofanov , 01-Авг-18 20:49 
> Началось...
> Я вот не сильно понимаю разницу между ( ) и { }.

В оснновном, с субшеллом -- без субшелла.

В не-основном - заморочки с разным "пониманием" ' ; ', ниже.

> Возможно вы знаете какие-то особенности использования { } внутри ( ) ?
> Это имели ввиду?

Я имел в виду то, что написал.  В основном то, что где-что с теми проверками, я не знаю.

>

 
> (
> ...
> { nginx -t && service nginx reload || echo "Nginx config error!"
> } 2>&1
> ...
> )
>

> Но тогда имеем:
> test4.sh: 27: Syntax error: ")" unexpected (expecting "}")

Это я знаю, почему, но никакого отношения к первому ответу оно не имеет.

Проблема вот в чём: перед ' ) ' точка с запяной не обязательна, а перед ' } ' она нужна.  Также перевод строки (примерно, как в моём первом ответе)  [во всяческих скобочных многосторчных конструкциях] [и без экранирования обратным слешом] равносилен ' ; '.

Поэтому:

или
( command1 && command2 || command3 ) 2>&1
, или
( command1 && command2 || command3; ) 2>&1
, или
{ command1 && command2 || command3; } 2>&1

, или
{
    command1 && command2 || command3
} 2>&1

, но не
{ command1 && command2 || command3 } 2>&1