Pendahuluan: Saya mengerti perbedaan antara -exec {} \;
& -exec {} +
. Saya juga tidak punya masalah seperti itu , saya hanya ingin tahu tentang semantik find
.
Saat mengakhiri -exec
argumen dengan +
alih - alih ;
, kita perlu mengakhiri ini dengan {} +
, misalnya:
# FreeBSD find
$ find . -type f -exec cp {} /tmp +
find: -exec: no terminating ";" or "+"
# GNU find is even more cryptic:
$ find: missing argument to `-exec'
Menggunakan ;
dalam contoh-contoh ini bukannya +
berfungsi dengan baik (tapi jelas melakukan sesuatu yang lain).
Dari POSIX :
-exec utility_name [argument ...] ;
-exec utility_name [argument ...] {} +
... Hanya <plus-sign> yang segera mengikuti argumen yang hanya berisi dua karakter "
{}
" yang akan menandai akhir dari ekspresi utama. Penggunaan lain dari <plus-sign> tidak akan diperlakukan sebagai khusus.
Dengan kata lain, saat menggunakan +
, perintah harus diakhiri dengan {} +
.
Kenapa ini? Dan mengapa hanya dengan +
dan bukan ;
? Pada awalnya saya pikir mungkin untuk menghindari konflik dengan nama file yang mengandung +
, tetapi nama file dengan ;
tampaknya berfungsi dengan baik? Saya merasa sulit untuk percaya batasan ini sewenang-wenang ...
The "-exec ... {} +" syntax adopted was a result of
IEEE PASC Interpretation 1003.2 #210
dan dalam dokumen itu Anda akan menemukan rincian lebih lanjut, misalnya:Note that the "+" is only treated as special if it immediately follows "{}". This minimises the chances of causing problems with existing uses of "+" as an argument with "-exec".
Jawaban:
The pemikiran yang diberikan dalam spesifikasi POSIX adalah:
Interpretasi PASC 1003.2 # 210 lebih detail tentang sejarah
-exec … {} +
. Itu ada pada beberapa sistem Unix sebelum diadopsi oleh POSIX; laporan cacat melacaknya kembali ke SVR4 (di mana sebagian besar tidak berdokumen). Laporan cacat membenarkan perubahan yang tidak kompatibel sebagai berdampak kecil dalam praktik:Meskipun menambahkan dukungan untuk
-exec … {} +
akan merusak beberapa aplikasi yang sesuai seperti contoh di atas, ada lebih sedikit dari ini daripada jika-exec … {} … +
diizinkan.Alasan lain, mungkin, untuk membatasi
{}
menjadi argumen terakhir adalah kemudahan implementasi. Jika{}
diizinkan di mana saja dalam daftar argumen-exec
,find
program harus membuat baris perintah dengan menyalin argumen statis, lalu bagian variabel, lalu bagian statis lainnya. Ini akan membuat lebih sulit untuk membangun daftar argumen dan memperhitungkan batas ukuran. Kesulitannya minimal, tetapi pelaksana suka memotong sudut. Mendukung banyak contoh yang dapat diganti{}
(jika-exec {} foo +
berfungsi, dapat diharapkan secara logis-exec {} foo {} +
juga) akan jauh lebih sulit.sumber