Anhang fehlt in Unix-Mail, wenn mehrere Dateien angehängt waren

Anhang fehlt in Unix-Mail, wenn mehrere Dateien angehängt waren

Ich versuche unter Unix mehrere Dateien anzuhängen, die das Ergebnis eines findBefehls 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 uFilesam Ende die Zeichenfolge enthalten ist foo bar qux, führt die letzte Zeile den Befehl (foomit den Argumenten barund qux)aus. Dies führt zu einer Fehlermeldung (foo: command not found(oder ähnlich) und maileiner leeren Eingabe.

Das ist nicht das einzige Problem mit dem Skript. Der Befehl, der die Variable aufbaut, uFilestut überhaupt nicht das, was Sie denken. Führen Sie es aus, bash -x /path/to/scriptum eine Ablaufverfolgung des Skripts anzuzeigen. Sie erhalten eine Vorstellung davon, was passiert. Sie führen echoden uuencodeBefehl aus, anstatt ihn auszuführen. Sie brauchen echodort 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 findist selten die einfachste Art, etwas zu tun. Sagen Sie stattdessen, finddass 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 maildirekt 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"

verwandte Informationen