Korzystam z systemu Solaris 10 i przetestowałem następujące opcje z ksh (88), bash (3.00) i zsh (4.2.1).
Poniższy kod nie daje żadnego wyniku:
function foo {
echo "Hello World"
}
find somedir -exec foo \;
Znalezisko pasuje kilka plików (jak pokazano poprzez zastąpienie -exec ...z -print), a funkcja działa idealnie, kiedy nazywa zewnątrz od findpołączenia.
Oto, co man findmówi strona -exec:
-exec polecenie Prawda, jeśli wykonane polecenie zwraca a
zero wartości jako status wyjścia. Koniec
polecenie musi być przerywane znakiem ucieczki
średnik (;). Argumentem polecenia {} jest
zastąpiony bieżącą nazwą ścieżki. Jeśli…
ostatnim argumentem dla -exec jest {} a ty
podaj + zamiast średnika (;),
polecenie jest wywoływane mniej razy, przy pomocy
{} zastąpiono grupami ścieżek. Jeśli
każde wywołanie polecenia zwraca a
wartość niezerowa jako status wyjścia, znajdź
zwraca niezerowy status wyjścia.
Prawdopodobnie mógłbym uciec, robiąc coś takiego:
for f in $(find somedir); do
foo
done
Ale boję się rozwiązywać problemy z separatorem pól.
Czy można wywołać funkcję powłoki (zdefiniowaną w tym samym skrypcie, nie zawracajmy sobie głowy problemami z zakresu) z find ... -exec ...wywołania?
Próbowałem zarówno /usr/bin/findi /bin/findotrzymał ten sam wynik.
PATH. Alternatywnie użyj sh -c '...'i zdefiniuj ORAZ uruchom funkcję w ...bicie. Może pomóc zrozumieć różnice między funkcjami a skryptami .
export -f foo