GNU/Linux >> Belajar Linux >  >> Linux

Menjalankan Fungsi yang Ditentukan Pengguna Dalam Panggilan Find -exec?

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.

Terkait:aksen -Temukan Arti- Pencarian Kamus!
Linux
  1. Cara Menemukan Semua Pengguna Sudo Di Linux

  2. Panggil ke fungsi yang tidak ditentukan simplexml_load_file() – Kesalahan PHP [Terpecahkan]

  3. Temukan -exec + Vs Temukan | Xargs:Yang Mana Yang Harus Dipilih?

  1. Fungsi Root Grup Pengguna??

  2. Mendapatkan Opsi -exec Di Temukan Untuk Bekerja?

  3. Kesalahan fatal:Panggil ke fungsi yang tidak ditentukan mysqli_connect() di /home/user/public_html/includes/connection.php

  1. temukan -exec cmd {} + vs | xargs

  2. temukan -exec fungsi shell di Linux?

  3. Cara mengetahui penggunaan memori pengguna di linux