bash - command line parameter whitespace strip - wie?

Post Reply
Message
Author
someone

bash - command line parameter whitespace strip - wie?

#1 Post by someone »

Hallo,

ich habe folgendes Problem:

Ein Daemon ruft bei bestimmten Ereignissen ein Bashscript auf und übergibt dabei
folgende Parameter

OBJ pathname filename eventumber eventtext

z.B. :
FILE /tmp/eventtest x.tmp 1234 deleted

Wenn ich mit folgendem Script die übergeben Parameter einlese und ausgebe funktioniert alles,
solange ich das von der command line probiere.
Sobald die Parameter jedoch vom Daemon kommen habe ich plötzlich einen Übergabeparameter mehr


Anscheinend übergibt der Daemon jedoch noch irgendwelche unsichtbaren Zeichen.


Anbei ein Beispiel für mein Problem:

meintest.sh:
***
#!/bin/bash
echo 1:$1 2:$2 3:$3 4:$4 5:$5 6:$6 >> meintest.log
***

Rufe ich nun folgendes auf bekomme ich:
$./meintest.sh FILE /tmp/eventtest x.tmp 1234 deleted
$tail -n 1 meintest.log
$1:FILE 2:/tmp/eventtest 3:x.tmp 4:1234 5:deleted

Wenn aber der Daemon das script aufruft erhalte ich:
$tail -n 1 meintest.log
$1:FILE 2: 3:/tmp/eventtest 4:x.tmp 5:1234 6:deleted

Wie kann ich alle leading und trailing whitespaces (ich tippe auf ein tab) mit bash Hausmitteln entfernen?

PS: wenn ich dem script noch ein ls $2/$3 >> meintest.log bzw. ein ls $3/$4 >> meintest.log hinzufüge,
erhalte ich bei Aufruf von der command line ein korektes Ergebnis.
Bei Aufruf durch den Daemon erhalte ich jedoch ein File not found

Ich danke im Voraus für eure Hilfe

User avatar
Janka
Posts: 3585
Joined: 11. Feb 2006 19:10

Re: bash - command line parameter whitespace strip - wie?

#2 Post by Janka »

someone wrote: Wie kann ich alle leading und trailing whitespaces (ich tippe auf ein tab) mit bash Hausmitteln entfernen?
Gar nicht.

Die Aufrufparameter werden einem Programm nicht als ein einziger String übergeben, sondern als ein Array von Strings, jeder String ein Parameter. Deshalb ist ein Parameter mit dem Wert NULL auch nicht von innerhalb deines Skripts irgendwie entfernbar, außer, den ersten Parameter grundsätzlich zu ignorieren oder halt den Daemon zu korrigieren.

$ man execve

Janka
Ich vertonne Spam immer in /dev/dsp statt /dev/null.
Ich mag die Schreie.

someone

bash - command line parameter whitespace strip - wie?

#3 Post by someone »

Naja, das klingt ja nicht gut!

Bei dem Daemon handelt es sich um incrond, welcher Veränderungen am
Filesystem meldet.
Diesen kann und will ich jedoch nicht fixen, da ich kein Programmierer bin

Meine Idee war jedoch sowas wie ein strip oder irgend eine Möglichkeit die Variablen
mittels z.B. awk etc. zu bereinigen und an eine neue Variable zu übergeben.

z.B. pathname=awk ???????? $n ???????

und erst dann im weitern Script zu verwenden.

Das ist insbesonders interresant, da ich siehe PS. z.B. den übergebenen
Filenamen ja auch nicht verwenden kann.

Danke jedoch für Deine Antwort.
Ich werde mich mit shell scripting wohl etwas intensiever beschäftigen müssen.

Sollte sonst noch jemand einen Ansatz haben Bitte ich um Antwort!

someone

bash - command line parameter whitespace strip - wie?

#4 Post by someone »

Sorry, ich bins nochmal

Ich habe zu dem Problem folgenden Mailinglist Eintrag gefunden:

http://inotify.aiken.cz/hypermail/incron/0009.html

Vielleicht kann damit jemand was anfagen?

Danke

User avatar
jochen
prolinux-forum-admin
Posts: 699
Joined: 14. Jan 2000 15:37
Location: Jülich
Contact:

#5 Post by jochen »

Als Quick'n'Dirty Workaround kannst Du "set $*" verwenden. Als Beispiel siehe folgendes Skript:

Code: Select all

#!/bin/bash

echo Vorher:
echo Anzahl Argumente: $#
for ARG ; do
    echo $ARG
done

set $*

echo Nachher:
echo Anzahl Argumente: $#
for ARG ; do
    echo $ARG
done
Das sieht zur Laufzeit so aus:

Code: Select all

$ ./notab.sh hallo "      " haha
Vorher:
Anzahl Argumente: 3
hallo

haha
Nachher:
Anzahl Argumente: 2
hallo
haha
$
Zwischen den Anführungszeichen habe ich in der Bash Ctrl-V Ctrl-I getippt, um ein literales Tabzeichen einzufügen (die bash will ja ansonsten immer eine Tab-Completion ausführen).

Nebenwirkung dieser Lösung: Sollte in irgendeinem anderen Argument Whitespace auftauchen, wird dieses Argument an dieser Stelle in 2 Argumente zerissen!


Daher wär's besser, incrond zu fixen bzw. die Konfigdatei: Steht da vielleicht zu Formatierungszwecken irgendwo ein Tab zuviel drin?

Jochen
Die grösste Lüge der EDV? "Mal eben..."

User avatar
Janka
Posts: 3585
Joined: 11. Feb 2006 19:10

Re: bash - command line parameter whitespace strip - wie?

#6 Post by Janka »

Da steht, du sollst in der Konfigurationsdatei von incrond einfach die einzelnen Parameter durch Leerzeichen abtrennen und nicht durch Tabs. Mach das doch einfach.

Janka
Ich vertonne Spam immer in /dev/dsp statt /dev/null.
Ich mag die Schreie.

someone

bash - command line parameter whitespace strip - wie?

#7 Post by someone »

erstmal Danke, Danke, Danke an Janka und Jochen

ich habe meine incrontab mit einem Hex Editor überprüft und dabei festgestellt, das keine Tabs drinnen sind.

Ich werde am kommenden Wochenende (oder wenn es die Arbeit zulässt früher)
den anderen Lösungsansatz von Jochen ausprobieren und euch danach Bescheid geben.

Weiters bin ich natürlich an jedem anderen input interresiert.

Ich versuche mit dem incrond ein nahezu echtzeit Backup einiger, weniger, sehr wichtigen Dateien über rsync auf einen Server zu erreichen.
Ich benötige also keine komplette Spiegelung eines Filesystem.
Anscheinend ist incrond das Mittel der Wahl, nur leider bekomme ich das ganze
nicht so hin wie ich will.

someone

PS: Demnächst werde ich mich wohl in diesem Forum registrieren.

Post Reply