Funktionsweise bash -c

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Benutzeravatar
AK-Palme
Beiträge: 411
Registriert: 25.05.2004 15:38:30
Kontaktdaten:

Funktionsweise bash -c

Beitrag von AK-Palme » 20.10.2007 01:46:05

Hi,
ich verstehe das System von dem -c-Parameter von der Bash nicht.

Code: Alles auswählen

       -c string If  the  -c  option  is  present, then commands are read from
		 string.  If there are arguments after the  string,  they  are
		 assigned to the positional parameters, starting with $0.
Das bedeutet in meinen Augen, dass ich hinschreibe

Code: Alles auswählen

bash -c "echo foo" bar
und er gibt mir "foo bar" aus.

Leider funktioniert das nicht.

Hintergrund ist folgender:
ich habe das Konstrukt "find .... | xargs" und möchte damit "myscript <Dateiname aus find> && rm <Dateiname aus find>" ausführen.

Mit meinem Verständnis von bash -c müsste das also so lauten:

Code: Alles auswählen

find ... | xargs bash -c "myscript $0 && rm $0"
Leider tut das nicht wie ich will :(

Kann mir jemand einen Tipp geben?

Ich suche eine Möglichkeit für diese Anwendung. Also nicht, dass ich das rm in das Script schreibe, sondern für mehrere Kommandos oder Pipe-Konstrukte mit xargs auszuführen. Ich stehe öfter mal vor dem Problem ;)

Gruss,
AK-Palme

yeti

Beitrag von yeti » 20.10.2007 04:07:30

Bau Dir doch erstmal die Kommandos zusammen, wie di sie brauchst, aber mit find, etwa so ...

Code: Alles auswählen

find /var/lib/dpkg/info -name '*.list' -printf 'aktion1 %p && aktion2 %p | aktion3 %p\n'
Das gibt eine Ausgabe à la ...

Code: Alles auswählen

aktion1 /var/lib/dpkg/info/libamrnb2.list && aktion2 /var/lib/dpkg/info/libamrnb2.list | aktion3 /var/lib/dpkg/info/libamrnb2.list
Dies kannst Du nochmal in Ruhe prüfen und wenn's Dir korrekt erscheint, wird das nochmal aufgerufen aber in bash gepiped ...

Code: Alles auswählen

find /var/lib/dpkg/info -name '*.list' -printf 'aktion1 %p && aktion2 %p | aktion3 %p\n' | bash
Das beantwortet zwar keine "-c"-spezifischen Fragen, aber könnte ein alternativer Weg zum Ziel sein, oder?

Benutzeravatar
detix
Beiträge: 1743
Registriert: 07.02.2007 18:51:28
Wohnort: MK

Beitrag von detix » 20.10.2007 09:30:13

AK-Palme hat geschrieben:Das bedeutet in meinen Augen, dass ich hinschreibe
Code:
bash -c "echo foo" bar
und er gibt mir "foo bar" aus.
Leider funktioniert das nicht.
Es würde funktionieren, wenn du einfache Ticks nimmst.

bash -c 'echo foo' bar
oder
bash -c 'echo foo $0' bar
oder
bash -c 'echo foo $0 $3' bar $(ls)
Gruß an alle Debianer, und immer daran denken:
Macht ohne Haftung funktioniert nicht!

Benutzeravatar
AK-Palme
Beiträge: 411
Registriert: 25.05.2004 15:38:30
Kontaktdaten:

Beitrag von AK-Palme » 20.10.2007 13:11:54

Danke ihr beiden.
Ich werde langfristig wohl beide Varianten benutzen :)
Ist ja lustich, ich hab Stundenlang probiert und gegoogelt, und hab einfach die falschen Tüddels genommen :o

Danke,
AK-Palme

Antworten