GNU/Linux >> Tutoriales Linux >  >> Linux

¿Ejecutando la función definida por el usuario en una llamada Find -exec?

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.

Relacionado:acento -Buscar significado- ¡Búsqueda en el diccionario!
Linux
  1. Cómo encontrar todos los usuarios de Sudo en Linux

  2. Llamada a función indefinida simplexml_load_file() – Error de PHP [Resuelto]

  3. Buscar -exec + Vs Buscar | Xargs:¿Cuál elegir?

  4. ¿Es Rsync ~/foo Target/foo lo mismo que Rsync ~/foo/ Target/foo/?

  5. ¿Obteniendo la opción -exec en Find To Work?

Comando Finger de Linux para encontrar detalles de usuario

Encuentra cuentas de usuario con contraseña vacía en Linux

Cómo encontrar el uso de la memoria del usuario en Linux

Llame a una función C desde el código C++

función de llamada declarada a continuación

Ejecutar un comando como usuario nologin