UbuntuUsersNeuling schrieb:
ich habe einen Denkfehler.
Im Wesentlichen ein kleines Syntaxproblem. ☺
Wir kann ich jetzt den Zusammengesetzten (bis jetzt noch) Text als Befehl ausführen lassen.
Machen wir das am Beispiel Sendmail.
| empfaenger="to@example.com"
absender="from@example.com"
befehl = sendmail -f $absender - t $empfaenger (... usw. die Parameterliste)
echo /usr/sbin/$befehl
|
Das Problem sind die Leerzeichen um das Gleichheitszeichen herum. Die müssen weg. In diesem Fall macht es allerdings wenig Sinn, den Befehl erst einer Variable zuzuweisen und ihn dann auszuführen. Zum einen gibt es ja nur eine Verwendung des Wertes (bei der Ausführung) und zu anderen macht es das Quoten schwerer. Besser ist:
| /usr/sbin/sendmail -f "$absender" "$empfaenger" (... usw. die Parameterliste)
|
Ansonsten solltest Du den Befehl in einem Array zusammen bauen, weil dann das Quoting besser funktioniert:
| # in einem Rutsch
befehl=(/usr/sbin/sendmail -f "$absender" "$empfaenger" (... usw. die Parameterliste))
# einzeln bzw. in Gruppen
befehl=(/usr/sbin/sendmail)
befehl+=(-f "$absender")
befehl+=("$empfaenger")
befehl+=(... usw. die Parameterliste)
# Ausführung
"${befehl[@]}"
|
Die Lösung von TomTobin hat den Nachteil, dass bei Sonderzeichen in Argumenten (z.B. wenn man das Subject der Mail auf der Kommandozeile angeben will, das ja oft Leerzeichen enthält) der Befehl am Ende nicht korrekt ausgeführt wird. Beispiel:
1
2
3
4
5
6
7
8
9
10
11
12
13 | $ befehl="sendmail -s 'ich habe heute zeit'"
$ printf '%s\n' $befehl
sendmail
-s
'ich
habe
heute
zeit'
$ befehl=(sendmail -s 'ich habe heute zeit')
$ printf '%s\n' "${befehl[@]}"
sendmail
-s
ich habe heute zeit
|
Wie Du siehst, wird im ersten Fall das Subject in mehrere Argumente zerhackt, während es mit dem Array klappt.
das echo $befehl zeigt mir den Befehl nur an, führt ihn aber doch nicht aus?
Genau.
ohne den echo-Befehl passiert gar nichts...
Du kannst relativ einfach sehen, was das Skript genau macht, indem Du hinter der ersten Zeile (mit dem Shebang) folgende Zeile einfügst:
Das gibt Dir einen Trace der Skriptausführung aus.
Irgendwo hab ich hier einen Denkfehler, der vermutlich ganz einfach ist.
Kann mir kurz jemand sagen, wo ich den Fehler eingebaut hab ☹
s.o.