Shellskript mit {...} und Pipe, Variable ist in Pipe nicht geändert

18/01/2009 - 11:06 von Kai Hildebrandt | Report spam
Hallo zusammen,

Für einen Skript zum Prüfen eines Backups, das die interessanten Teile
aus den Backuplogs schneidet, verwende ich einach { und }, um einen
Mailtext zu generieren und damit eine temporàre Datei zu verhindern.
(Anm.: Ich habe auch schon mit einer Subshell gearbeitet, also mit (
und ), aber da ist es ja klar, dass das nicht funktioniert, da die
(kopierte) Variable aus der Subshell ja nicht "nach oben"
weitergereicht wird.)

Das E-Mail Subject steht hierbei in einer Variable und besteht aus zwei
Teilen: "${subject}: ${status}"

Der Skriptaufbau ist in etwa so:

function send_mail() {
local subject="backup checker"
local status="all ok"
{
echo ...
cat ...
if [ ...fehler_gefunden... ] ; then
status="with warnings"
fi
} | mail -s "${subject}: ${status}"
}

Jetzt ist es so, dass sich die Variable $status nicht àndert.

Die Frage ist nur, warum?

Und wie kann ich mein Ziel erreichen, so dass ich das E-Mail Subject je
nach gefundenem Status àndern kann?

Achso:
Ich verwende die GNU bash, version 3.2.39(1)-release (i486-pc-linux-gnu)
unter debian "lenny".

Danke & Gruß
Kai
 

Lesen sie die antworten

#1 Thomas Orgelmacher
18/01/2009 - 10:46 | Warnen spam
Kai Hildebrandt schrieb:
Das E-Mail Subject steht hierbei in einer Variable und besteht aus zwei
Teilen: "${subject}: ${status}"

Der Skriptaufbau ist in etwa so:

function send_mail() {
local subject="backup checker"
local status="all ok"
{
echo ...
cat ...
if [ ...fehler_gefunden... ] ; then
status="with warnings"
fi
} | mail -s "${subject}: ${status}"
}

Jetzt ist es so, dass sich die Variable $status nicht àndert.

Die Frage ist nur, warum?



"mail" làuft in einem anderen Prozess, ist aber schon geforkt wenn
Du $status zuweist. Du hast $status also schon geàndert, nur nicht
beim richtigen Prozess.

Und wie kann ich mein Ziel erreichen, so dass ich das E-Mail Subject je
nach gefundenem Status àndern kann?



function send_mail() {
local subject="backup checker"
local status="all ok"
local tempfile=`mktemp /tmp/mail.XXXXXX`

{
echo ...
cat ...
if [ ...fehler_gefunden... ] ; then
status="with warnings"
fi
} > "$tempfile"

mail -s "${subject}: ${status}" < "$tempfile"
rm "$tempfile"

echo "$status"
}

Oder so...


HTH

Orgel

I have seen things you lusers would not believe. I've seen Sun
monitors on fire off the side of the multimedia lab. I've seen
NTU lights glitter in the dark near the Mail Gate. All these
things will be lost in time, like the root partition last week.

Ähnliche fragen