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.