GNU/Linux >> Znalost Linux >  >> Linux

Provádění uživatelem definované funkce ve volání Find -exec?

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 {} +

ksh88typeset -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.

Související:přízvuk -Najdi význam- Vyhledávání ve slovníku!
Linux
  1. Najít -exec + Vs Najít | Xargs:Který si vybrat?

  2. Je Rsync ~/foo Target/foo stejný jako Rsync ~/foo/ Target/foo/?

  3. Funkce kořene uživatelské skupiny??

  1. Získání možnosti -exec v aplikaci Najít do práce?

  2. Vymanit se z hledání, pokud selže -exec?

  3. Závažná chyba:Volání nedefinované funkce mysqli_connect() v /home/user/public_html/includes/connection.php

  1. najít -exec funkci shellu v Linuxu?

  2. Jak zjistit využití uživatelské paměti v linuxu

  3. Volání funkce C z kódu C++