Hallo Liste, irgendwann ist immer das erste Mal. Jetzt wollte ich mir ein Startskript für ddclient einrichten, damit ich das nicht immer von Hand machen muß. ddclient ist bei mir als Einmalaufruf realisiert, nicht als Daemon. Braucht's auch nicht. /etc/skeleton nach /etc/init.d/ddclient kopiert und FOO durch DDCLIENT ersetzt. YaST zeigt mir das Skript nun auch schon im Runlevel-Editor. Aber... es kommt ein Fehler, den ich nicht zu interpretieren weiß. (Das Skript wird dennoch ausgeführt, sprich, meine dynamische IP-Adresse beim dyndns-Dienst hinterlegt). Die Shell meint bei der Ausführung: ./ddclient: line 110: exit: 5}: numeric argument required Das gehört zum Text: # Check for missing binaries (stale symlinks should not happen) DDCLIENT_BIN=/usr/sbin/ddclient test -x $DDCLIENT_BIN || {echo "$DDCLIENT_BIN not installed"; exit 5} Das Skript liegt auch genau da. (Ich habe mir das mittels rpm installiert, also auch kein Eigenstrick). Was möchte denn die Shell von mir? Helga -- ## Content Developer OpenOffice.org: lang/DE ## Office-Suite für Linux, Mac, Windows -- http://de.openoffice.org/ ## Werkstatt & Information zu OpenSource -- http://www.eschkitai.de/ ## Etikette, nein Danke? -- http://www.suse-etikette.de.vu/
Helga Fischer schrieb:
Die Shell meint bei der Ausführung: ./ddclient: line 110: exit: 5}: numeric argument required
Das gehört zum Text:
# Check for missing binaries (stale symlinks should not happen) DDCLIENT_BIN=/usr/sbin/ddclient test -x $DDCLIENT_BIN || {echo "$DDCLIENT_BIN not installed"; exit 5}
Das Skript liegt auch genau da. (Ich habe mir das mittels rpm installiert, also auch kein Eigenstrick).
Was möchte denn die Shell von mir?
Leerzeichen um die geschweiften Klammern! Rupert
Am Dienstag 19 Oktober 2004 11:25 schrieb Rupert Kolb:
Helga Fischer schrieb:
Die Shell meint bei der Ausführung: ./ddclient: line 110: exit: 5}: numeric argument required
Das gehört zum Text:
# Check for missing binaries (stale symlinks should not happen) DDCLIENT_BIN=/usr/sbin/ddclient test -x $DDCLIENT_BIN || {echo "$DDCLIENT_BIN not installed"; exit 5}
Das Skript liegt auch genau da. (Ich habe mir das mittels rpm installiert, also auch kein Eigenstrick).
Was möchte denn die Shell von mir?
Leerzeichen um die geschweiften Klammern!
Die sind aber doch da. Und hinten ein newline. Ganz davon abgesehen, ich glaube, das Skeleton-Skript wird noch von mehr Leuten verwendet, ein solcher Fehler wäre doch sicher aufgefallen. Die Leerzeichen habe ich nichtsdestotrotz kontrolliert und reingesetzt. Es bleibt bei der gleichen Fehlermeldung. Helga -- ## Content Developer OpenOffice.org: lang/DE ## Office-Suite für Linux, Mac, Windows -- http://de.openoffice.org/ ## Werkstatt & Information zu OpenSource -- http://www.eschkitai.de/ ## Etikette, nein Danke? -- http://www.suse-etikette.de.vu/
Helga Fischer schrieb: [...]
Die Shell meint bei der Ausführung: ./ddclient: line 110: exit: 5}: numeric argument required
Das gehört zum Text:
# Check for missing binaries (stale symlinks should not happen) DDCLIENT_BIN=/usr/sbin/ddclient test -x $DDCLIENT_BIN || {echo "$DDCLIENT_BIN not installed"; exit 5}
Das Skript liegt auch genau da. (Ich habe mir das mittels rpm installiert, also auch kein Eigenstrick).
Was möchte denn die Shell von mir?
Leerzeichen oder allgemeiner whitespace um die geschweiften Klammern: man bash ... { list; } list is simply executed in the current shell environment. list must be terminated with a new-line or semicolon. This is known as a group command. The return status is the exit status of list. Note that unlike the metacharacters ( and , { and } are reserved words and must occur where a reserved word is permitted to be recognized. Since they do not cause a word break, they must be separated from list by whitespace. ... Rupert
Rupert Kolb schrieb:
Helga Fischer schrieb: [...]
Die Shell meint bei der Ausführung: ./ddclient: line 110: exit: 5}: numeric argument required
Das gehört zum Text:
# Check for missing binaries (stale symlinks should not happen) DDCLIENT_BIN=/usr/sbin/ddclient test -x $DDCLIENT_BIN || {echo "$DDCLIENT_BIN not installed"; exit 5}
richtig sollte sein: ... || { echo "$DDCLIENT_BIN not installed"; exit 5; } ^ ^ ^ ^ whitespace Whitespace ^ Semikolon (ich habe damit auch schon gekämpft) Rupert
Leerzeichen oder allgemeiner whitespace um die geschweiften Klammern:
man bash ... { list; } list is simply executed in the current shell environment. list must be terminated with a new-line or semicolon. This is known as a group command. The return status is the exit status of list. Note that unlike the metacharacters ( and , { and } are reserved words and must occur where a reserved word is permitted to be recognized. Since they do not cause a word break, they must be separated from list by whitespace. ...
Hallo Rupert, Am Dienstag 19 Oktober 2004 13:52 schrieb Rupert Kolb:
Rupert Kolb schrieb:
Helga Fischer schrieb: [...]
Die Shell meint bei der Ausführung: ./ddclient: line 110: exit: 5}: numeric argument required
Das gehört zum Text:
# Check for missing binaries (stale symlinks should not happen) DDCLIENT_BIN=/usr/sbin/ddclient test -x $DDCLIENT_BIN || {echo "$DDCLIENT_BIN not installed"; exit 5}
richtig sollte sein:
... || { echo "$DDCLIENT_BIN not installed"; exit 5; } ^ ^ ^ ^ whitespace Whitespace ^ Semikolon
(ich habe damit auch schon gekämpft)
Irgendwie arg selektiv. # Check for existence of needed config file and read it DDCLIENT_CONFIG=/etc/ddclient.conf test -r $DDCLIENT_CONFIG || {echo "$DDCLIENT_CONFIG not existing"; exit 6} . $FOO_CONFIG Hier läuft das Skript nämlich durch und da sind keine Leerzeichen notwendig. In der oberen Zeile habe ich sie eingefügt und siehe da, dann war Ruhe. Aber es leuchtet mir nicht ein. Jetzt kommt das nächste: ./ddclient: line 265: syntax error: unexpected end of file Im Skript wird ein case ... bis zum esac rc_exit abgearbeitet. Das rc_exit ist mit einem Return abgeschlossen. Leerzeichen bringt hier leider nichts. Das Return weglassen auch nicht. Irgendwie erinnert mich das fatal an die Here-Dokumente in Perl. Die machten auch immer Stress, was ihre Beendigung angeht. Hast Du noch einen Tipp auf Lager? In meinen zwei (kleinen) Bash-Büchern finde ich nämlich nichts. Helga -- ## Content Developer OpenOffice.org: lang/DE ## Office-Suite für Linux, Mac, Windows -- http://de.openoffice.org/ ## Werkstatt & Information zu OpenSource -- http://www.eschkitai.de/ ## Etikette, nein Danke? -- http://www.suse
Helga Fischer schrieb: [...]
Jetzt kommt das nächste:
./ddclient: line 265: syntax error: unexpected end of file
Im Skript wird ein case ... bis zum
esac rc_exit
abgearbeitet.
Das rc_exit ist mit einem Return abgeschlossen. Leerzeichen bringt hier leider nichts. Das Return weglassen auch nicht.
Irgendwie erinnert mich das fatal an die Here-Dokumente in Perl. Die machten auch immer Stress, was ihre Beendigung angeht.
Hast Du noch einen Tipp auf Lager? In meinen zwei (kleinen) Bash-Büchern finde ich nämlich nichts.
nimm einen Editor, der Syntax highlighting kann. Dann siehst Du zumindest schon ein paar "offensichtliche" Fehler. "unexpected end of file" ist so ein Kandidat. ein Buch zur Shell Programmierung: - "Helmut Herold: Linux-Unix-Shells" ist mein Favorit. Rupert
Hallo, Am Tue, 19 Oct 2004, Helga Fischer schrieb:
Am Dienstag 19 Oktober 2004 13:52 schrieb Rupert Kolb:
Rupert Kolb schrieb:
richtig sollte sein:
... || { echo "$DDCLIENT_BIN not installed"; exit 5; } ^ ^ ^ ^ whitespace Whitespace ^ Semikolon (ich habe damit auch schon gekämpft)
Der Whitespace nach der öffnenden Klammer ist notwendig, ebenso wie das Semikolon vor der schließenden Klammer. Ein Whitespace vor oder nach der schließenden Klammer ist aber nicht notwendig (der vorher, weil die Bash am Semikolon die Tokens trennt). $ { echo foo;} foo Das geht auch so aus der manpage hervor: { list; } list is simply executed in the current shell envi ronment. list must be terminated with a newline or semicolon. Man beachte hier den letzten Satz.
# Check for existence of needed config file and read it DDCLIENT_CONFIG=/etc/ddclient.conf test -r $DDCLIENT_CONFIG || {echo "$DDCLIENT_CONFIG not existing"; exit 6}
s.o. Richtig: test -r $DDCLIENT_CONFIG || { echo "$DDCLIENT_CONFIG not existing" >&2 exit 6 } Oder: test -r $DDCLIENT_CONFIG \ || { echo "$DDCLIENT_CONFIG not existing" >&2; exit 6; } Generell gilt: Semikolon und Zeilenumbruch sind äquivalent. Ein maskierter (mit '\' abgeschlossener) Zeilenumbruch ist aber keiner!
. $FOO_CONFIG
Hier ist FOO_CONFIG sicher nicht gesetzt, was durchaus den anderen Fehler verursachen könnte. -dnh -- Censorship sucks^W is for your own good.
David Haller schrieb:
Hallo,
Am Tue, 19 Oct 2004, Helga Fischer schrieb:
Am Dienstag 19 Oktober 2004 13:52 schrieb Rupert Kolb:
Rupert Kolb schrieb:
richtig sollte sein:
... || { echo "$DDCLIENT_BIN not installed"; exit 5; } ^ ^ ^ ^ whitespace Whitespace ^ Semikolon (ich habe damit auch schon gekämpft)
Der Whitespace nach der öffnenden Klammer ist notwendig, ebenso wie das Semikolon vor der schließenden Klammer. Ein Whitespace vor oder nach der schließenden Klammer ist aber nicht notwendig (der vorher, weil die Bash am Semikolon die Tokens trennt).
Ja, ist plausibel. Eine kleine Ergänzung: der Zeilenvorschub (aber nicht der maskierte, s.u.) zählt auch als whitespace (zumindest in Perl und Python). R.
$ { echo foo;} foo
Das geht auch so aus der manpage hervor:
{ list; } list is simply executed in the current shell envi ronment. list must be terminated with a newline or semicolon.
Man beachte hier den letzten Satz.
# Check for existence of needed config file and read it DDCLIENT_CONFIG=/etc/ddclient.conf test -r $DDCLIENT_CONFIG || {echo "$DDCLIENT_CONFIG not existing"; exit 6}
s.o. Richtig:
test -r $DDCLIENT_CONFIG || { echo "$DDCLIENT_CONFIG not existing" >&2 exit 6 }
Oder:
test -r $DDCLIENT_CONFIG \ || { echo "$DDCLIENT_CONFIG not existing" >&2; exit 6; }
Generell gilt: Semikolon und Zeilenumbruch sind äquivalent. Ein maskierter (mit '\' abgeschlossener) Zeilenumbruch ist aber keiner!
. $FOO_CONFIG
Hier ist FOO_CONFIG sicher nicht gesetzt, was durchaus den anderen Fehler verursachen könnte.
-dnh
Hi David, Am Mittwoch 20 Oktober 2004 03:32 schrieb David Haller:
Am Tue, 19 Oct 2004, Helga Fischer schrieb:
Am Dienstag 19 Oktober 2004 13:52 schrieb Rupert Kolb:
Rupert Kolb schrieb:
richtig sollte sein:
... || { echo "$DDCLIENT_BIN not installed"; exit 5; } ^ ^ ^ ^ whitespace Whitespace ^ Semikolon (ich habe damit auch schon gekämpft)
Der Whitespace nach der öffnenden Klammer ist notwendig, ebenso wie das Semikolon vor der schließenden Klammer. Ein Whitespace vor oder nach der schließenden Klammer ist aber nicht notwendig (der vorher, weil die Bash am Semikolon die Tokens trennt).
Thx.
. $FOO_CONFIG
Stimmt.
Hier ist FOO_CONFIG sicher nicht gesetzt, was durchaus den anderen Fehler verursachen könnte.
War's aber nicht. Hab's zwar verbessert, klar, aber jetzt plagt mich noch das unerwartete Ende der Datei. Dafür weiß ich jetzt, daß man fte über ssh in der Konsole vergessen kann (unbedienbar) und der vim erst noch ein Plugin wünscht, damit er Steuerzeichen und sonstigen bösen Krimskrams anzeigt. Helga -- ## Content Developer OpenOffice.org: lang/DE ## Office-Suite für Linux, Mac, Windows -- http://de.openoffice.org/ ## Werkstatt & Information zu OpenSource -- http://www.eschkitai.de/ ## Etikette, nein Danke? -- http://www.suse-etikette.de.vu/
Hallo, Am Wed, 20 Oct 2004, Helga Fischer schrieb:
War's aber nicht. Hab's zwar verbessert, klar, aber jetzt plagt mich noch das unerwartete Ende der Datei.
Dann such mal nach nicht geschlossenen "", '' oder `` Paaren. Ansonsten zeig mal das komplette script (per PM) her. -dnh --
Aber nochmal zu MEINEM Problem: ich habe genau 2 Programme denen ich verbieten will (egal auf welchem port) eine Verbindung nach aussen herzustellen. OS ist WinXP. -- Ralf Kuntoff Und wie heißt das andere Programm? -- Rainer Koenig, in dcsf
Helga Fischer wrote:
Jetzt wollte ich mir ein Startskript für ddclient einrichten, damit ich das nicht immer von Hand machen muß. ddclient ist bei mir als Einmalaufruf realisiert, nicht als Daemon. Braucht's auch nicht.
/etc/skeleton nach /etc/init.d/ddclient kopiert und FOO durch DDCLIENT ersetzt.
YaST zeigt mir das Skript nun auch schon im Runlevel-Editor.
Ich habe ein /etc/init.d/ddclient script hier laufen, welches ich bei Bedarf mailen kann. Für Einmalaufruf ist doch besser folgendes für "/etc/ppp/ip-up.d/", dann wird nach jeder Einwahl kurz die IP übermittelt. Das habe ich seit gestern laufen. Habe aber noch Fragen zu: IP=${IP:-$4} oder IP=${IP:-$3} Wo kann ich nachlesen woher die Variablen: $4 u.ä. bei SuSE9.1 genommen werden? ------------------------------------------------------------------------- #!/bin/sh ############################################### ## Local-IP updating on http://www.dyndns.org every ISP (re)conncet. ## Copy to /etc/ppp/ip-up.d/ ## NOTE: /etc/ddclient.conf must edit first! ## ## - On my host, pppd invokes this script with args: ## /etc/ppp/ip-up.d/ddclientstart ppp0 eth1 0 local-IP gateway-IP ## 'ifcfg-dsl0' 'provider0' ## - From the manual page for my pppd, these aguments are: ## scriptname interface-name tty-device speed local-IP-address ## remote-IP-address ipparam ## Author: Paul Burry ############################################### PATH=/usr/sbin:${PATH} IP= IP=${IP:-$PPP_LOCAL} IP=${IP:-$IPLOCAL} IP=${IP:-$4} ## Update the DynDNS.org server unless the IP address is a private address ## that may be used as a internal LAN address (or PPtP tunnel). logger -t ddclient $0 $* case "$IP" in 10.*) ;; 172.1[6-9].* | 172.2[0-9].* | 172.3[0-1].*) ;; 192.168.*) ;; "") logger -t ddclient No local IP given so cannot update ;; *) ( sleep 5 ddclient -daemon=0 -syslog -use=if -if=$1 >/dev/null 2>&1 echo -n "ddclient changed IP address to $1" ) & ;; esac ------------------------------------------------------------------------- -- Ciao Marco, registered GNU/Linux-User 313353
Am Dienstag, 19. Oktober 2004 22:56 schrieb Marco Maske:
Wo kann ich nachlesen woher die Variablen: $4 u.ä. bei SuSE9.1 genommen werden?
daher wo sie bei jedem shellscript stammen. man bash. $4 ist der 4. parameter der dem script übergeben wurde. und die konstruktion IP=${IP:-$4} bedeutet: pack den wert des 4. parameters in die variable IP aber nur wenn IP leer ist. bye, MH
participants (5)
-
David Haller
-
Helga Fischer
-
Marco Maske
-
Mathias Homann
-
Rupert Kolb