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.