Ich verwende Solaris 10 und habe Folgendes mit ksh (88), bash (3.00) und zsh (4.2.1) getestet.
Der folgende Code liefert kein Ergebnis:
function foo {
echo "Hello World"
}
find somedir -exec foo ;
Die Suche stimmt mit mehreren Dateien überein (wie durch Ersetzen von -exec ... gezeigt wird). mit -print ), und die Funktion funktioniert perfekt, wenn sie außerhalb von find aufgerufen wird anrufen.
Hier ist, was der man find findet Seite sagen über -exec :
-exec command True if the executed command returns a
zero value as exit status. The end of
command must be punctuated by an escaped
semicolon (;). A command argument {} is
replaced by the current pathname. If the
last argument to -exec is {} and you
specify + rather than the semicolon (;),
the command is invoked fewer times, with
{} replaced by groups of pathnames. If
any invocation of the command returns a
non-zero value as exit status, find
returns a non-zero exit status.
Ich könnte wahrscheinlich davonkommen, so etwas zu tun:
for f in $(find somedir); do
foo
done
Aber ich habe Angst, mich mit Feldtrennzeichen auseinanderzusetzen.
Ist es möglich, eine Shell-Funktion (definiert im selben Skript, kümmern wir uns nicht um Bereichsprobleme) von einem find ... -exec ... anrufen?
Ich habe es sowohl mit /usr/bin/find versucht und /bin/find und bekam das gleiche Ergebnis.
Akzeptierte Antwort:
Eine function ist lokal für eine Shell, also brauchen Sie find -exec um eine Shell zu erzeugen und diese Funktion in dieser Shell zu definieren, bevor Sie sie verwenden können. Etwas wie:
find ... -exec ksh -c '
function foo {
echo blan: "[email protected]"
}
foo "[email protected]"' ksh {} +
bash ermöglicht es, Funktionen über die Umgebung mit export -f zu exportieren , also können Sie (in bash) Folgendes tun:
foo() { ...; }
export -f foo
find ... -exec bash -c 'foo "[email protected]"' bash {} +
ksh88 hat typeset -fx to export-Funktion (nicht über die Umgebung), aber das kann nur von she-bang less-Skripten verwendet werden, die von ksh ausgeführt werden , also nicht mit ksh -c .
Eine weitere Option ist:
find ... -exec ksh -c "
$(typeset -f foo)"'
foo "[email protected]"' ksh {} +
Verwenden Sie also typeset -f um die Definition von foo auszugeben Funktion innerhalb des Inline-Skripts. Beachten Sie, dass wenn foo andere Funktionen verwendet, müssen Sie diese ebenfalls ausgeben.