Unix - Stderr и stdout в двух файлах

Ваш код:

echo "There are "$qSize "emails in the mail queue" | sed 's/^/To: '"$sTo"'\nSubject: *ALERT* - Mail queue o
n '"$host"' exceeds limit\nFrom: '"$sFr"'\n\n/' | sendmail -t

больно читать. Хуже того, даже если вы -отформатируете его, чтобы сделать его читабельным, бесполезное использование sedбудет странным -просто неправильным. Вы используете sedдля вставки заголовков электронной почты перед выводом оператора эха. В этом нет никакого смысла.

Короче говоря, вам не нужно использовать здесь sed, и вы не должны использовать здесь sed. Это не добавляет ничего, кроме дополнительных сложностей и возможностей для ошибок.

Вместо этого сделайте что-нибудь подобное:

sendmail -t <<EOF
From: $sFr
To: $sTo
Subject: *ALERT* - Mail queue on '$host' exceeds limit

There are $qSize emails in the mail queue

EOF

или вот так:

subject="*ALERT* - Mail queue on '$host' exceeds limit"
message="There are $qSize emails in the mail queue"

echo "$message" | sendmail -f "$sFR" -s "$subject" "$sTO"

или даже так:

{
  echo "From: $sFr"
  echo "To: $sTo"
  echo "Subject: *ALERT* - Mail queue on '$host' exceeds limit"
  echo
  echo "There are $qSize emails in the mail queue"
} | sendmail -t

Даже так лучше:

echo "From: $sFr
To: $sTo
Subject: *ALERT* - Mail queue on '$host' exceeds limit

There are $qSize emails in the mail queue" | sendmail -t

Короче говоря, почти любой другой способ передачи нескольких строк текста в другую программу (sendmail, в данном случае )предпочтительнее того, как это делаете вы.

0
06.11.2019, 15:28
3 ответа

echo "Query execution failed"

Это только семантически сообщение об ошибке.

exec 2>&1 1>>$logfile

Это может иметь смысл --первая часть ничего не делает, недавно я проверял это для bobdylan --но где этот файл ошибок, который вы упомянули?


Я так понимаю по комментариям :этот скрипт не так красиво интерпретировать.


Вот несколько основных примеров. Пользователь bobdylan больше не могу найти.

]# ls. NOsuch         
ls: cannot access 'NOsuch': No such file or directory
.:
foo

И STDOUT 1, и STDERR 2идут на стандартное устройство вывода, "терминал".

Теперь я разделяю их. Вместо /dev/null можно указать любое имя файла.

]# ls. NOsuch >/dev/null
ls: cannot access 'NOsuch': No such file or directory

]# ls. NOsuch 2>/dev/null
.:
foo
]# ls. NOsuch >/dev/null 2>&1
(EMPTY)

]# ls. NOsuch 2>&1 >/dev/null     
ls: cannot access 'NOsuch': No such file or directory

(2>&1 has no effect)  

И

ls... >ls.out 2>ls.ERRORS

...должен не выводить результат, а сохранять оба "потока" по отдельности.


Оставьте сценарий простым, и вносите изменения, когда вы вызываете его.

1
28.01.2020, 02:21

Как было сказано ранее, вы перенаправляете STDERR и STDOUT в один и тот же файл. ... exec 2>&1 1>>$logfile

Эта строка перенаправляет STDERR на STDOUT, а затем перенаправляет STDOUT (, который также является STDERR ), на файловый дескриптор $logfile. Перенаправление и файловые дескрипторы могут запутать. Но загляните сюда, чтобы получить полезную информацию :

.

https://likegeeks.com/shell-scripting-awesome-guide-part4/

Кроме того, поиск в Google по перенаправлению linux и файловым дескрипторам linux может оказаться полезным.

ура,

Дж.Б.

0
28.01.2020, 02:21
exec 2>&1 1>>$logfile 

Это сначала перенаправит stderr туда, куда когда-либо идет stdout в этой точке, и только затем перенаправит stdout в файл журнала. Результатом, скорее всего, будет то, что stderr переходит к терминалу, а stdout — к лог-файлу.

(Я не уверен, как вы имели в виду, что вывод в два файла, поскольку на самом деле упоминается только один. Разве что идея запустить скрипт как script.sh > errorfile, но это было бы странно.)

Конечно, все ваши echoкоманды просто выводят на стандартный вывод, поэтому все их выходные данные будут отправлены в одно и то же место. Однако lsможет привести к ошибкам, тогда они отправятся в терминал.

Если вы хотите перенаправить обычный вывод и вывод ошибок в два разных файла, просто сделайте это:

exec 1>>"$logfile" 2>>"$errorfile"

Теперь вы можете использовать:

echo "Something worked normally"

и

echo "This is an error message" >&2

для вывода нормального состояния в журнал и сообщений об ошибках в файл ошибок. (Обратите внимание на перенаправление.)


Другое дело:

eval logfile="$1"_"$now".log
eval number=$1
eval path=$2

evalздесь бесполезны и сломают вещи, например. если $1содержит пробелы или, что еще хуже, подстановку команд. Так что просто избавься от них. Присваивание в оболочке — это просто var=value, поэтому:

logfile="$1"_"$now".log
number=$1
path=$2

Первую можно также записать как logfile=$1_$now.log, но вам решать, что красивее.

2
28.01.2020, 02:21

Теги

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