Uso Solaris 10 e ho testato quanto segue con ksh (88), bash (3.00) e zsh (4.2.1).
Il codice seguente non produce alcun risultato:
function foo {
echo "Hello World"
}
find somedir -exec foo ;
La ricerca corrisponde a diversi file (come mostrato sostituendo -exec ... con -print ), e la funzione funziona perfettamente quando viene chiamata al di fuori di find chiama.
Ecco cosa trova l'man find la pagina dice su -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.
Probabilmente potrei cavarmela facendo qualcosa del genere:
for f in $(find somedir); do
foo
done
Ma ho paura di dover affrontare problemi con i separatori di campo.
È possibile chiamare una funzione di shell (definita nello stesso script, non preoccupiamoci di problemi di scoping) da un find ... -exec ... chiamare?
L'ho provato sia con /usr/bin/find e /bin/find e ottenuto lo stesso risultato.
Risposta accettata:
Una function è locale in una shell, quindi avresti bisogno di find -exec per generare una shell e avere quella funzione definita in quella shell prima di poterla usare. Qualcosa come:
find ... -exec ksh -c '
function foo {
echo blan: "[email protected]"
}
foo "[email protected]"' ksh {} +
bash consente di esportare funzioni tramite l'ambiente con export -f , quindi puoi fare (in bash):
foo() { ...; }
export -f foo
find ... -exec bash -c 'foo "[email protected]"' bash {} +
ksh88 ha typeset -fx per esportare la funzione (non tramite l'ambiente), ma che può essere utilizzata solo da script she-bang less eseguiti da ksh , quindi non con ksh -c .
Un'altra opzione è fare:
find ... -exec ksh -c "
$(typeset -f foo)"'
foo "[email protected]"' ksh {} +
Cioè, usa typeset -f per scaricare la definizione di foo funzione all'interno dello script inline. Nota che se foo utilizza altre funzioni, dovrai anche scaricarle.