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.