Forum: PC Hard- und Software bash: wie funktioniert das?


von Taucher (Gast)


Lesenswert?

Folgendes Codefragment:
1
find ~ -exec bash -c '
2
  for f do
3
    machwas $f
4
  done
5
' {} +

find wird benutzt, um einen Dateibaum zu iterieren:
1
find ~ -exec programm {} +

Es wird ein Block von Datei- und Verzeichnisnamen eingesammelt und an 
programm als Parameterliste übergeben – so weit klar.

Nun wird im ersten Schnipsel die bash mit dem script als Parameter (-c) 
aufgerufen, auf das Skript folgen die von find übergebenen Namen – so 
weit auch klar.

Aber: wir kommt die bash auf die Idee, dass sie über den Rest der 
Parameterliste iterieren soll?

von Martin (Gast)


Lesenswert?

for +

von Taucher (Gast)


Lesenswert?

Nein, das + ist es nicht. Das gehört zum Aufruf von find ~ -exec und 
bewirkt, dass nicht jeder Namen einzeln ausgegeben wird, sondern als 
Block aus mehreren Namen.

von basher (Gast)


Lesenswert?

1
for f do
Normalerweise kennt man den for-Befehl der (ba)sh als
[code]for f in a b c[code]
dann iteriert das über a b und c.

Ohne in und ohne Werte iteriert es über $1 $2 $... (also "$@")

Da find bei {} aber nur genau einen Parameter ($1) übergibt ist das 
etwas sinnlos...

von Yalu X. (yalu) (Moderator)


Lesenswert?

Taucher schrieb:
> Nein, das + ist es nicht.

Aber das for.

von Daniel A. (daniel-a)


Lesenswert?

"for f do" ist doch einfach ein shortcut für "for f in "$@"; do"
1
dpa@dragonfly:~$ bash -c 'for f do echo "$f"; done' -- 1 2 3
2
1
3
2
4
3
5
dpa@dragonfly:~$ bash -c 'for f in "$@"; do echo "$f"; done' -- 1 2 3
6
1
7
2
8
3
9
dpa@dragonfly:~$

von Yalu X. (yalu) (Moderator)


Lesenswert?

basher schrieb:
> Da find bei {} aber nur genau einen Parameter ($1) übergibt ist das
> etwas sinnlos...

Das + bewirkt, dass die gefundenen Dateinamen in eine längere
Argumentliste gesammelt und an das Kommando (hier das Bash-Skript)
übergeben werden.

Da das Skript die Argumentliste in der For-Schleife wieder in ihre
Bestandteile zerlegt, hätte man das Ganze aber auch einfacher als
1
find ~ -exec machwas {} \;

schreiben können.

von Andreas S. (Firma: Schweigstill IT) (schweigstill) Benutzerseite


Lesenswert?

Bei der ganzen Angelegenheit muss man sich auch unbedingt das Verhalten 
anschauen, wenn Leerzeichen in Verzeichnis- oder Dateinamen vorkommen.

von Yalu X. (yalu) (Moderator)


Lesenswert?

Andreas S. schrieb:
> Bei der ganzen Angelegenheit muss man sich auch unbedingt das Verhalten
> anschauen, wenn Leerzeichen in Verzeichnis- oder Dateinamen vorkommen.

Um das $f in
1
    machwas $f

gehören noch Anführungszeichen, also
1
    machwas "$f"

Der Rest sollte eigentlich funktionieren.

von Taucher (Gast)


Lesenswert?

Daniel A. schrieb:
> "for f do" ist doch einfach ein shortcut für "for f in "$@"; do"

Das würde das Verhalten erklären. Weisst du, wo das steht?

Yalu X. schrieb:
> hätte man das Ganze aber auch einfacher als

Hätte nur den Nachteil, dass es dann noch viel länger braucht, um einen 
ausgewachsenen Dateibaum zu iterieren…

Yalu X. schrieb:
> Um das $f in
>     machwas $f
>
> gehören noch Anführungszeichen, also

Damit hast du zweifellos Recht, aber das war nicht die Frage…

von DPA (Gast)


Lesenswert?

Taucher schrieb:
> Daniel A. schrieb:
>> "for f do" ist doch einfach ein shortcut für "for f in "$@"; do"
>
> Das würde das Verhalten erklären. Weisst du, wo das steht?

https://www.gnu.org/software/bash/manual/bash.html#index-for
> If ‘in words’ is not present, the for command executes the commands
> once for each positional parameter that is set, as if ‘in "$@"’
> had been specified

von Yalu X. (yalu) (Moderator)


Lesenswert?

Oder
1
help for

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.