Option mit Leerzeichen in /etc/default/service geht nicht

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
rupi64
Beiträge: 6
Registriert: 26.10.2009 21:45:47

Option mit Leerzeichen in /etc/default/service geht nicht

Beitrag von rupi64 » 26.10.2009 22:17:09

Hallo,

bei manchen Services gibt es in /etc/default/ eine gleichnamige Datei, in der man Startoptionen angeben kann. Allerdings, was macht man, falls die Option ein Leerzeichen enthalten soll.

Ich spreche von folgender Situation:

/etc/default/service:
OPTIONS="--flag1 --text=A B"

/etc/init.d/service:
....
/sbin/service $OPTIONS

Dabei übergibt die Bash dem Service folgende Parameter "--flag1", "--text=A" und "B". Für das Beispiel soll es aber offensichtlich möglich sein, den Parameter "--text=A B" zu übergeben. Leider kann man dazu nicht einfach nur Anführungszeichen oder Escape-Sequenzen hinzufügen, da die nach der Substitution beim Start nicht mehr interpretiert werden.

Geht das tatsächlich nicht oder weiß jemand eine Lösung? (Natürlich jeweils ohne /etc/init.d/service zu verändern.)


Gruß

Rupert

Milbret
Beiträge: 827
Registriert: 26.05.2008 12:04:54
Lizenz eigener Beiträge: GNU Free Documentation License
Wohnort: Nörten-Hardenberg
Kontaktdaten:

Re: Option mit Leerzeichen in /etc/default/service geht nicht

Beitrag von Milbret » 26.10.2009 22:24:20

Bin leider kein Bashskripter aber du könntest versuchen folgendes zu machen.

OPTIONS="--flag1 --text=\"A B\""

Ob dies geht weiß ich leider nicht :(

Martin
Es gibt keine if Schleife -> http://www.if-schleife.de/
Ansonsten GPL/GNU/Linux/Debian/Free Software 4 Ever :D

rupi64
Beiträge: 6
Registriert: 26.10.2009 21:45:47

Re: Option mit Leerzeichen in /etc/default/service geht nicht

Beitrag von rupi64 » 26.10.2009 22:29:27

Hallo Martin,

wie ich schon geschrieben habe, geht es nicht einfach nur mit Anführungszeichen und Escape-Sequenzen. Denn \" wird zwar bei der Deklaration noch zu ", aber "A B" wird beim Starten des Service nicht mehr zu einem Parameter, sondern zu zweien, nämlich "A und B", sprich die Anführungszeichen werden nicht mehr interpretiert.

Benutzeravatar
novalix
Beiträge: 1909
Registriert: 05.10.2005 12:32:57
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: elberfeld

Re: Option mit Leerzeichen in /etc/default/service geht nicht

Beitrag von novalix » 27.10.2009 10:11:19

Hi,
schon mal mit Hochkommata probiert?

Code: Alles auswählen

OPTIONS="--flag1 --text='A B'"
Groetjes, niels
Das Wem, Wieviel, Wann, Wozu und Wie zu bestimmen ist aber nicht jedermannns Sache und ist nicht leicht.
Darum ist das Richtige selten, lobenswert und schön.

rupi64
Beiträge: 6
Registriert: 26.10.2009 21:45:47

Re: Option mit Leerzeichen in /etc/default/service geht nicht

Beitrag von rupi64 » 27.10.2009 13:36:31

Hallo Niels,

ja, die werden ebenfalls nicht interpretiert. Ihr könnt das übrigens leicht selbst in der Bash testen: D="\"A B\"";ls $D gibt
ls: cannot access "A: No such file or directory
ls: cannot access B": No such file or directory
aus und ich will
ls: cannot access A B: No such file or directory
erreichen.

123456
Beiträge: 6126
Registriert: 08.03.2003 14:07:24

Re: Option mit Leerzeichen in /etc/default/service geht nicht

Beitrag von 123456 » 27.10.2009 14:18:20

Darf man fragen welcher Service das überhaupt so abfragt? - und wenns ein eigener Service ist, warum du das nicht einfach unter /init.d ins Skript packst.

rupi64
Beiträge: 6
Registriert: 26.10.2009 21:45:47

Re: Option mit Leerzeichen in /etc/default/service geht nicht

Beitrag von rupi64 » 27.10.2009 20:30:11

Hallo,

bei mir sind einige installiert, die das so machen:

Code: Alles auswählen

./hal:DAEMON_OPTS=
./ntp:NTPD_OPTS='-g'
./ssh:SSHD_OPTS=
./nfs-kernel-server:RPCMOUNTDOPTS="-p 32767"
./nfs-kernel-server:RPCSVCGSSDOPTS=
./rsync:RSYNC_OPTS=''
./fail2ban:FAIL2BAN_OPTS=""
./nfs-common.ucf-old:STATDOPTS="--port 32765 --outgoing-port 32766"
./postgrey:POSTGREY_OPTS="--inet=127.0.0.1:60000"
./nfs-common:STATDOPTS=
./nfs-kernel-server.ucf-old:RPCMOUNTDOPTS="-p 900"
./prelink:PRELINK_OPTS=-mR
Einen konkreten Service, bei dem ich einen Parameter mit Leerzeichen übergeben können muss, gibt es übrigens nicht, falls du das wissen wolltest.

deberik
Beiträge: 1177
Registriert: 30.09.2009 13:27:23

Re: Option mit Leerzeichen in /etc/default/service geht nicht

Beitrag von deberik » 27.10.2009 23:22:21

Ich dachte immer, dass reicht mit dem Backspace, wieder was gelernt.

Ich hab kurz gegoogelt (nach bash variable leerzeichen) und die Lösung gefunden. Du musst beim Aufruf der Variable die Variable auch unter Anführungszeichen setzen und die Escape-Zeichen kannst du vergessen. Also

Code: Alles auswählen

D="A B"
und beim Abruf

Code: Alles auswählen

ls "$D"
Debians Paketbeschreibungen übersetzen? Hilf mit!

rupi64
Beiträge: 6
Registriert: 26.10.2009 21:45:47

Re: Option mit Leerzeichen in /etc/default/service geht nicht

Beitrag von rupi64 » 29.10.2009 11:26:16

Hallo deberik,

das ls $D steht für den Aufruf des Services innerhalb des Startskripts und eben den möchte ich ja nicht verändern müssen. Mittlerweile glaube ich jedoch, dass es nur durch das Ändern des Werts der Variable gar nicht möglich ist. Zumindest habe ich nun einen scheinbar passenden Abschnitt in der Manpage von Bash gefunden:
Word Splitting
The shell scans the results of parameter expansion, command substitution, and
arithmetic expansion that did not occur within double quotes for word split‐
ting.
Insbesondere werden in dem Abschnitt keine vom Wert der Variable abhängigen Außnahmen erwähnt, bei denen die Wörter nicht gesplittet werden. Demnach scheint es keine Möglichkeit zu geben, das Wordsplitting durch irgendwelche Änderungen am Wert der Variable zu beeinflussen.

Antworten