Ich versuche unter Unix mehrere Dateien anzuhängen, die das Ergebnis eines find
Befehls sind. Beim Versuch die Mail zu versenden fehlen die Anhänge.
dir=$path
echo "Entered into $spr/sum_master"
for fil in `find $dir -ctime -2 -type f -name "Sum*pdf*"`
do
uFiles=`echo "$uFiles ; uuencode $fil $fil"`
done
\($uFiles\) | mailx -s "subject" [email protected]
Was ist an diesem Code falsch?
Antwort1
Wenn uFiles
am Ende die Zeichenfolge enthalten ist foo bar qux
, führt die letzte Zeile den Befehl (foo
mit den Argumenten bar
und qux)
aus. Dies führt zu einer Fehlermeldung (foo: command not found
(oder ähnlich) und mail
einer leeren Eingabe.
Das ist nicht das einzige Problem mit dem Skript. Der Befehl, der die Variable aufbaut, uFiles
tut überhaupt nicht das, was Sie denken. Führen Sie es aus, bash -x /path/to/script
um eine Ablaufverfolgung des Skripts anzuzeigen. Sie erhalten eine Vorstellung davon, was passiert. Sie führen echo
den uuencode
Befehl aus, anstatt ihn auszuführen. Sie brauchen echo
dort nicht:
uFiles="$uFiles
$(uuencode "$fil" "$fil")"
Damit funktioniert die Schleife zwar, aber sie ist fehleranfällig; insbesondere bricht sie bei Dateinamen ab, die Leerzeichen und andere Sonderzeichen enthalten (sieheWarum gerät mein Shell-Skript ins Stocken, wenn es sich um Leerzeichen oder andere Sonderzeichen handelt?für weitere Erklärungen). Das Parsen der Ausgabe find
ist selten die einfachste Art, etwas zu tun. Sagen Sie stattdessen, find
dass der gewünschte Befehl ausgeführt werden soll.
find "$dir" -ctime -2 -type f -name "Sum*pdf*" -exec uuencode {} {} \;
Die Ausgabe davon ist die Verkettung der uuencoded-Dateien, die Sie erstellen wollten. Sie können sie mail
direkt als Eingabe übergeben an:
find "$dir" -ctime -2 -type f -name "Sum*pdf*" -exec uuencode {} {} \; |
mailx -s "subject" [email protected]
Wenn Sie mögliche Fehler des uuencode-Schritts erkennen möchten, können Sie ihn in eine Variable packen (achten Sie jedoch darauf, dass diese sehr groß sein kann):
attachments=$(find "$dir" -ctime -2 -type f -name "Sum*pdf*" -exec uuencode {} {} \;)
if [ $? -ne 0 ]; then
echo 1>&2 "Error while encoding attachments, aborting."
exit 2
fi
if [ -z "$attachments" ]; then
echo 1>&2 "Notice: no files to attach, so mail not sent."
exit 0
fi
echo "$attachments" | mailx -s "subject" [email protected]
Alternativ können Sie eine temporäre Datei schreiben.
attachments=
trap 'rm -f "$attachments"' EXIT HUP INT TERM
attachments=$(mktemp)
find "$dir" -ctime -2 -type f -name "Sum*pdf*" -exec uuencode {} {} \; >"$attachments"
if [ $? -ne 0 ]; then
echo 1>&2 "Error while encoding attachments, aborting."
exit 2
fi
if ! [ -s "$attachments" ]; then
echo 1>&2 "Notice: no files to attach, so mail not sent."
exit 0
fi
mailx -s "subject" [email protected] <"$attachments"