Apakah "tunggu &" ("tunggu ampersand") merupakan idiom atau teknik skrip shell / shell yang berguna?


12

Saya telah "mewarisi" beberapa skrip shell untuk mesin Linux yang menjalankan shell "bash" GNU. Dalam satu kasus tertentu, mesin menjalankan GNU bash versi 2.0.5b

Salah satu skrip tersebut memiliki wait &instruksi ("tunggu ampersand") sebagai bagian dari "untuk baris" dari sebuah forloop. Pada pandangan pertama, itu sepertinya idiom penasaran / menarik, tetapi pencarian web saya untuk itu tidak menghasilkan sesuatu yang relevan. man waitmemperlihatkan halaman "BASH_BUILTINS" ("BASH BUILTINS COMMAND"), yang memiliki uraian berikut:

wait [n]  
  Wait for the specified process and return its termination status.
  n may be a process ID or a job spec­ification;  if  a  job spec is given,
  all processes in that job's pipeline are waited for.  If n is not
  given, all currently active child processes are waited for, and the 
  return status is zero. If n speci­fies a non-existent process or job, 
  the return status is 127.  Otherwise, the return status is the exit 
  status of the last process or job waited for.

Dengan membaca bagian dari halaman manual ini, tampaknya bagi saya yang wait &diam-diam (di latar belakang) memastikan bahwa " semua proses anak yang sedang aktif menunggu, dan status kembalinya nol ." Apakah saya benar dalam penafsiran ini? Apakah ini idiom yang umum dan / atau berguna?

Untuk konteks tambahan, saya berbicara tentang jenis penggunaan berikut dalam skrip:

for file in `ls *.txt ; wait &`
do
   ...
   [cp instructions]
   ...
   [mv instructions]
   ...
   [mailx instruction]
done

Jawaban:


14

Saya tidak dapat membayangkan alasan untuk menulis kode ini, dan saya tidak yakin apa yang ingin dicapai oleh orang yang menulis kode ini. waitdi sini tidak apa-apa - dari perspektif, ada yang tidak ada proses anak, sehingga hanya akan keluar segera dan pada dasarnya bertindak sebagai noop ( waitsendiri mengeksekusi dalam proses anak karena substitusi perintah, tapi itu tidak berhubungan).

Selain itu, parsing output ls cukup rapuh . Sebagai gantinya, pertimbangkan untuk hanya melakukan ini:

for file in *.txt; do
    ...
done
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.