Ваш код:
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
, в данном случае )предпочтительнее того, как это делаете вы.
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
...должен не выводить результат, а сохранять оба "потока" по отдельности.
Оставьте сценарий простым, и вносите изменения, когда вы вызываете его.
Как было сказано ранее, вы перенаправляете STDERR и STDOUT в один и тот же файл.
... exec 2>&1 1>>$logfile
Эта строка перенаправляет STDERR на STDOUT, а затем перенаправляет STDOUT (, который также является STDERR ), на файловый дескриптор $logfile. Перенаправление и файловые дескрипторы могут запутать. Но загляните сюда, чтобы получить полезную информацию :
.https://likegeeks.com/shell-scripting-awesome-guide-part4/
Кроме того, поиск в Google по перенаправлению linux и файловым дескрипторам linux может оказаться полезным.
ура,
Дж.Б.
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
, но вам решать, что красивее.