GNU/Linux >> Tutoriels Linux >  >> Linux

Exécution d'une fonction définie par l'utilisateur dans un appel Find -exec ?

Je suis sur Solaris 10 et j'ai testé les éléments suivants avec ksh (88), bash (3.00) et zsh (4.2.1).

Le code suivant ne donne aucun résultat :

function foo {
    echo "Hello World"
}

find somedir -exec foo ;

La recherche correspond à plusieurs fichiers (comme indiqué en remplaçant -exec ... avec -print ), et la fonction fonctionne parfaitement lorsqu'elle est appelée en dehors de find appeler.

Voici ce que l'man find la page parle 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.

Je pourrais probablement m'en sortir en faisant quelque chose comme ça :

for f in $(find somedir); do
    foo
done

Mais j'ai peur d'avoir affaire à des problèmes de séparateur de champs.

Est-il possible d'appeler une fonction shell (définie dans le même script, ne nous embêtons pas avec les problèmes de portée) à partir d'un find ... -exec ... appeler ?

Je l'ai essayé avec les deux /usr/bin/find et /bin/find et j'ai obtenu le même résultat.

Réponse acceptée :

Une function est local à un shell, vous aurez donc besoin de find -exec pour générer un shell et avoir cette fonction définie dans ce shell avant de pouvoir l'utiliser. Quelque chose comme :

find ... -exec ksh -c '
  function foo {
    echo blan: "[email protected]"
  }
  foo "[email protected]"' ksh {} +

bash permet d'exporter des fonctions via l'environnement avec export -f , vous pouvez donc faire (en bash) :

foo() { ...; }
export -f foo
find ... -exec bash -c 'foo "[email protected]"' bash {} +

ksh88 a typeset -fx pour exporter la fonction (pas via l'environnement), mais cela ne peut être utilisé que par des scripts she-bang moins exécutés par ksh , donc pas avec ksh -c .

Une autre option est de faire :

find ... -exec ksh -c "
  $(typeset -f foo)"'
  foo "[email protected]"' ksh {} +

Autrement dit, utilisez typeset -f pour vider la définition de foo fonction à l'intérieur du script en ligne. Notez que si foo utilise d'autres fonctions, vous devrez également les vider.

En relation:accent -Trouver le sens- Recherche de dictionnaire !
Linux
  1. Comment trouver tous les utilisateurs de Sudo sous Linux

  2. Rechercher -exec + Vs Rechercher | Xargs :lequel choisir ?

  3. Est-ce que Rsync ~/foo Target/foo est identique à Rsync ~/foo/ Target/foo/?

  4. Comment appeler une fonction Bash dans le script Bash à l'intérieur d'Awk ?

  5. Manipuler la chaîne de retour {} à partir de Find -exec ?

Commande Linux Finger pour trouver les détails de l'utilisateur

Trouver des comptes d'utilisateurs avec un mot de passe vide sous Linux

Comment trouver l'utilisation de la mémoire utilisateur sous Linux

Appeler une fonction C à partir du code C++

fonction d'appel déclarée ci-dessous

Exécuter une commande en tant qu'utilisateur nologin