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.