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.