Estoy en Solaris 10 y probé lo siguiente con ksh (88), bash (3.00) y zsh (4.2.1).
El siguiente código no arroja ningún resultado:
function foo {
echo "Hello World"
}
find somedir -exec foo ;
La búsqueda coincide con varios archivos (como se muestra al reemplazar -exec ... con -print ), y la función funciona perfectamente cuando se llama fuera de find llamar.
Esto es lo que el man find página dice acerca de -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.
Probablemente podría salirme con la mía haciendo algo como esto:
for f in $(find somedir); do
foo
done
Pero tengo miedo de lidiar con los problemas del separador de campos.
¿Es posible llamar a una función de shell (definida en el mismo script, no nos molestemos con los problemas de alcance) desde un find ... -exec ... llamar?
Lo probé con ambos /usr/bin/find y /bin/find y obtuve el mismo resultado.
Respuesta aceptada:
Una function es local para un shell, por lo que necesitaría find -exec para generar un shell y tener esa función definida en ese shell antes de poder usarla. Algo como:
find ... -exec ksh -c '
function foo {
echo blan: "[email protected]"
}
foo "[email protected]"' ksh {} +
bash permite exportar funciones a través del entorno con export -f , por lo que puede hacer (en bash):
foo() { ...; }
export -f foo
find ... -exec bash -c 'foo "[email protected]"' bash {} +
ksh88 tiene typeset -fx para exportar la función (no a través del entorno), pero eso solo puede ser usado por she-bang less scripts ejecutados por ksh , entonces no con ksh -c .
Otra opción es hacer:
find ... -exec ksh -c "
$(typeset -f foo)"'
foo "[email protected]"' ksh {} +
Es decir, use typeset -f para volcar la definición de foo función dentro del script en línea. Tenga en cuenta que si foo usa otras funciones, también deberá volcarlas.