Saya sedang mempelajari skrip shell dengan bash dan saya perlu tahu perbedaan antara (...)dan {...}. Bagaimana seseorang memilih di antara keduanya saat menulis skrip?
Setelah bertahun-tahun pengembangan shell saya tidak tahu Anda bisa menggunakan tanda kurung untuk menjalankan fungsi dalam subkulit. Ide yang sangat bagus untuk menghindari polusi namespace global!
l0b0
7
Menggunakan localkata kunci berjalan jauh untuk membersihkan polusi itu.
glenn jackman
2
Ya, tetapi Anda harus ingat untuk mendeklarasikan setiap variabel lokal, dan itu mengacaukan kode.
l0b0
4
Petunjuk: Jika Anda ingin fungsi bebas efek samping tetapi hindari sintaks deklarasi fungsi yang tidak biasa (yang mungkin tidak disadari oleh editor kode) maka gunakan tanda kurung pada pemanggilan fungsi alih-alih deklarasi:pwd; (count_tmp); pwd;
Juve
2
ke shell ... foo () (:;) setara dengan foo () {(:;); } Itulah yang dilaporkannya jika Anda bertanya!
Menempatkan daftar perintah di antara tanda kurung menyebabkan lingkungan subkulit dibuat, dan masing-masing perintah dalam daftar dieksekusi di subkulit itu. Karena daftar dieksekusi dalam subkulit, tugas variabel tidak tetap berlaku setelah subkulit selesai.
{}
{ list;}
Menempatkan daftar perintah antara kurung kurawal menyebabkan daftar dieksekusi dalam konteks shell saat ini. Tidak ada subkulit yang dibuat. Tanda titik koma (atau baris baru) diperlukan.
Kode dalam '{}' dieksekusi di utas / proses / lingkungan saat ini dan perubahan dipertahankan, agar lebih ringkas, kode dijalankan dalam cakupan saat ini.
Kode di '()' dijalankan di dalam proses bash anak terpisah yang dibuang setelah eksekusi. Proses anak ini sering disebut sebagai sub-shell dan dapat dianggap sebagai ruang lingkup baru seperti anak.
Perhatikan pada contoh pertama dengan '{}' variabel masih disetel bahkan setelah penutupan '}', sedangkan dalam contoh dengan '()' variabel tidak disetel di luar ruang lingkup '()'.
Jawaban:
Jika Anda ingin efek samping dari daftar perintah mempengaruhi shell Anda saat ini , gunakan
{...}
Jika Anda ingin membuang efek samping, gunakan
(...)
Misalnya, saya mungkin menggunakan subkulit jika saya:
$IFS
beberapa perintah, tapi saya tidak ingin mengubah$IFS
secara global untuk shell saat inicd
suatu tempat, tetapi saya tidak ingin mengubah$PWD
untuk shell saat iniPenting untuk dicatat bahwa tanda kurung dapat digunakan dalam definisi fungsi:
penggunaan normal: kawat gigi: fungsi tubuh dijalankan di shell saat ini; efek samping tetap ada setelah fungsi selesai
penggunaan yang tidak biasa: tanda kurung: fungsi tubuh dijalankan dalam sebuah subkulit; efek samping menghilang ketika subkulit keluar
Dokumentasi
sumber
local
kata kunci berjalan jauh untuk membersihkan polusi itu.pwd; (count_tmp); pwd;
Dari dokumentasi resmi bash :
sumber
Kode dalam '{}' dieksekusi di utas / proses / lingkungan saat ini dan perubahan dipertahankan, agar lebih ringkas, kode dijalankan dalam cakupan saat ini.
Kode di '()' dijalankan di dalam proses bash anak terpisah yang dibuang setelah eksekusi. Proses anak ini sering disebut sebagai sub-shell dan dapat dianggap sebagai ruang lingkup baru seperti anak.
Sebagai contoh pertimbangkan hal berikut ...
Perhatikan pada contoh pertama dengan '{}' variabel masih disetel bahkan setelah penutupan '}', sedangkan dalam contoh dengan '()' variabel tidak disetel di luar ruang lingkup '()'.
sumber
(...)
digunakan untuk menjalankan kode dalam sub-shell. Kode yang digunakan antara kami{...}
tidak akan digunakan dalam sub-shell.sumber