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.