GNU/Linux >> Linux Esercitazione >  >> Linux

Esecuzione di una funzione definita dall'utente in una chiamata Find -exec?

Uso Solaris 10 e ho testato quanto segue con ksh (88), bash (3.00) e zsh (4.2.1).

Il codice seguente non produce alcun risultato:

function foo {
    echo "Hello World"
}

find somedir -exec foo ;

La ricerca corrisponde a diversi file (come mostrato sostituendo -exec ... con -print ), e la funzione funziona perfettamente quando viene chiamata al di fuori di find chiama.

Ecco cosa trova l'man find la pagina dice su -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.

Probabilmente potrei cavarmela facendo qualcosa del genere:

for f in $(find somedir); do
    foo
done

Ma ho paura di dover affrontare problemi con i separatori di campo.

È possibile chiamare una funzione di shell (definita nello stesso script, non preoccupiamoci di problemi di scoping) da un find ... -exec ... chiamare?

L'ho provato sia con /usr/bin/find e /bin/find e ottenuto lo stesso risultato.

Risposta accettata:

Una function è locale in una shell, quindi avresti bisogno di find -exec per generare una shell e avere quella funzione definita in quella shell prima di poterla usare. Qualcosa come:

find ... -exec ksh -c '
  function foo {
    echo blan: "[email protected]"
  }
  foo "[email protected]"' ksh {} +

bash consente di esportare funzioni tramite l'ambiente con export -f , quindi puoi fare (in bash):

foo() { ...; }
export -f foo
find ... -exec bash -c 'foo "[email protected]"' bash {} +

ksh88 ha typeset -fx per esportare la funzione (non tramite l'ambiente), ma che può essere utilizzata solo da script she-bang less eseguiti da ksh , quindi non con ksh -c .

Un'altra opzione è fare:

find ... -exec ksh -c "
  $(typeset -f foo)"'
  foo "[email protected]"' ksh {} +

Cioè, usa typeset -f per scaricare la definizione di foo funzione all'interno dello script inline. Nota che se foo utilizza altre funzioni, dovrai anche scaricarle.

Correlati:accent -Trova significato- Cerca nel dizionario!
Linux
  1. Ottenere l'opzione -exec in Trova per funzionare?

  2. Come chiamare una funzione Bash nello script Bash all'interno di Awk?

  3. Manipola {} Restituisce la stringa da Find -exec?

  4. Errore irreversibile:chiamata alla funzione non definita mysqli_connect() in /home/user/public_html/includes/connection.php

  5. trova -exec cmd {} + vs | xargs

Comando Linux Finger per trovare i dettagli dell'utente

Trova account utente con password vuota in Linux

Rompere la ricerca se un -exec fallisce?

trovare -exec una funzione di shell in Linux?

Chiama una funzione C dal codice C++

Spiegazione della manipolazione della funzione Bash