I'm belajar shell scripting dengan bash dan aku perlu tahu perbedaan antara (...)
dan {...}
. Bagaimana cara memilih di antara dua saat menulis script?
Jika anda ingin efek samping dari daftar perintah untuk mempengaruhi anda saat ini shell, gunakan {...}
Jika anda ingin membuang efek samping, penggunaan (...)
Sebagai contoh, saya akan menggunakan subkulit jika saya:
$IFS
untuk beberapa perintah, tapi aku don't ingin mengubah $IFS
global untuk saat ini shellcd
di suatu tempat, tapi aku don't ingin mengubah $PWD
untuk saat ini shellIt's yang berharga untuk dicatat bahwa tanda kurung dapat digunakan dalam definisi fungsi:
$ count_tmp() { cd /tmp; file=(*); echo "${#file[@]}"; } $ pwd; count_tmp; pwd /home/jackman Sebelas /tmp $ echo "${#file[@]}" Sebelas
$ cd ; unset file $ count_tmp() (cd /tmp; file=(*); echo "${#file[@]}") $ pwd; count_tmp; pwd /home/jackman Sebelas /home/jackman $ echo "${#file[@]}" Nol
Dari situs resmi bash dokumentasi:
()
( klik disini ) Menempatkan daftar perintah antara tanda kurung menyebabkan subkulit lingkungan yang akan dibuat, dan setiap perintah dalam daftar yang akan dieksekusi dalam subkulit. Karena daftar dijalankan dalam suatu subkulit, tugas-tugas variabel tidak tetap berlaku setelah subkulit selesai.
{}
{ daftar; } Menempatkan daftar perintah antara kurung kurawal menyebabkan daftar yang akan dieksekusi pada saat ini shell konteks. Tidak ada subkulit yang dibuat. Titik koma (atau newline) berikut daftar diperlukan.
Kode di '{}' dijalankan di thread saat ini/proses/lingkungan dan perubahan yang diawetkan, untuk menempatkan lebih ringkas, kode dijalankan dalam lingkup saat ini. Kode di '()' dijalankan dalam terpisah, anak proses bash yang dibuang setelah eksekusi. Anak ini proses ini sering disebut sebagai sub-shell dan dapat dianggap sebagai anak-anak, seperti ruang lingkup.
Sebagai contoh, pertimbangkan yang berikut ini...
~ # { test_var=test }
~ # echo $test_var
test
~ # ( test_var2=test2 )
~ # echo $test_var2
~ #
Perhatikan pada contoh pertama dengan '{}' variabel ini masih menetapkan bahkan setelah penutupan '}', sedangkan dalam contoh dengan '()' variabel ini tidak diatur di luar lingkup '()'.
(...)
digunakan untuk menjalankan kode di sub-shell. Kode yang digunakan bewteen {...}
tidak't dapat digunakan dalam sub-shell.