Saya menggunakan Solaris 10 dan saya telah menguji yang berikut ini dengan ksh (88), bash (3.00) dan zsh (4.2.1).
Kode berikut tidak memberikan hasil apa pun:
function foo {
echo "Hello World"
}
find somedir -exec foo ;
Temuan itu cocok dengan beberapa file (seperti yang ditunjukkan dengan mengganti -exec ... dengan -print ), dan fungsinya bekerja dengan sempurna saat dipanggil di luar dari find panggilan.
Inilah yang man find halaman mengatakan tentang -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.
Saya mungkin bisa lolos melakukan sesuatu seperti ini:
for f in $(find somedir); do
foo
done
Tapi saya takut berurusan dengan masalah pemisah bidang.
Apakah mungkin untuk memanggil fungsi shell (didefinisikan dalam skrip yang sama, jangan repot-repot dengan masalah pelingkupan) dari find ... -exec ... telepon?
Saya mencobanya dengan /usr/bin/find dan /bin/find dan mendapatkan hasil yang sama.
Jawaban yang Diterima:
Sebuah function bersifat lokal untuk shell, jadi Anda perlu find -exec untuk menelurkan shell dan memiliki fungsi yang didefinisikan dalam shell itu sebelum dapat menggunakannya. Sesuatu seperti:
find ... -exec ksh -c '
function foo {
echo blan: "[email protected]"
}
foo "[email protected]"' ksh {} +
bash memungkinkan seseorang untuk mengekspor fungsi melalui lingkungan dengan export -f , sehingga Anda dapat melakukannya (dalam bash):
foo() { ...; }
export -f foo
find ... -exec bash -c 'foo "[email protected]"' bash {} +
ksh88 memiliki typeset -fx untuk mengekspor fungsi (bukan melalui lingkungan), tetapi itu hanya dapat digunakan oleh skrip she-bang yang lebih sedikit yang dieksekusi oleh ksh , jadi tidak dengan ksh -c .
Pilihan lain adalah melakukan:
find ... -exec ksh -c "
$(typeset -f foo)"'
foo "[email protected]"' ksh {} +
Yaitu, gunakan typeset -f untuk membuang definisi foo fungsi di dalam skrip sebaris. Perhatikan bahwa jika foo menggunakan fungsi lain, Anda juga harus membuangnya.