bash: wie funktioniert das?

Gast #7338239
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?

Gast #7338287
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...

Moderator #7338294
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.

Gast #7338410
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…

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren