Používám Solaris 10 a testoval jsem následující s ksh (88), bash (3.00) a zsh (4.2.1).
Následující kód nepřinese žádný výsledek:
function foo {
echo "Hello World"
}
find somedir -exec foo ;
Hledání se shoduje s několika soubory (jak je ukázáno nahrazením -exec ... pomocí -print ) a funkce funguje perfektně, když je volána mimo find zavolejte.
Zde je to, co man find stránka říká o -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.
Pravděpodobně bych mohl utéct udělat něco takového:
for f in $(find somedir); do
foo
done
Ale bojím se řešit problémy se separátorem polí.
Je možné volat funkci shellu (definovanou ve stejném skriptu, neřešme problémy s rozsahem) z find ... -exec ... zavolat?
Zkoušel jsem to s oběma /usr/bin/find a /bin/find a dostal stejný výsledek.
Přijatá odpověď:
function je lokální pro shell, takže budete potřebovat find -exec vytvořit shell a mít tuto funkci definovanou v tomto shellu, než ji budete moci použít. Něco jako:
find ... -exec ksh -c '
function foo {
echo blan: "[email protected]"
}
foo "[email protected]"' ksh {} +
bash umožňuje exportovat funkce přes prostředí pomocí export -f , takže můžete udělat (v bash):
foo() { ...; }
export -f foo
find ... -exec bash -c 'foo "[email protected]"' bash {} +
ksh88 má typeset -fx exportovat funkci (ne přes prostředí), ale tu mohou používat pouze skripty spouštěné ksh , takže ne pomocí ksh -c .
Další možností je udělat:
find ... -exec ksh -c "
$(typeset -f foo)"'
foo "[email protected]"' ksh {} +
To znamená, že použijte typeset -f vypsat definici foo funkce uvnitř vloženého skriptu. Všimněte si, že pokud foo používá jiné funkce, budete je také muset vypsat.