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.