Baris berikut membuat file_c-6.txt
tetapi keluaran 5
:
$ i=5; ls file_a-${i}.txt file_b-${i}.txt > file_c-$(( ++i )).txt; echo $i
5
$ cat file_c-6.txt
file_a-5.txt
file_b-5.txt
Jika seseorang menghapusnya >
akan daftar file_c-6.txt
dan output 5
:
Saya tidak mengerti mengapa itu tidak menyimpan nilai i
dalam contoh pertama.
$ i=5; ls file_a-${i}.txt file_b-${i}.txt file_c-$(( ++i )).txt; echo $i
file_a-5.txt file_b-5.txt file_c-6.txt
6
echo
sebagai gantinyals
, itu bekerja dengan cara kedua dalam kedua kasus./bin/echo
mempertahankan perbedaan, sehingga sepertinya pengalihan output untuk perintah eksternal terjadi dalam subkulit.Jawaban:
Jika Anda menjalankan ini di bawah strace, Anda dapat melihat bahwa versi yang menggunakan
ls
memulai perintah dalam sebuah subkulit, di mana versi yang menggunakan gema mengeksekusi semuanya dalam shell yang ada.Bandingkan keluaran dari
melawan
Anda akan melihat yang pertama:
Dan yang kedua:
Dalam contoh terakhir ini, Anda melihat
clone
proses baru (dari 1258 -> 1259), jadi sekarang kita sedang dalam proses. Pembukaan file_c-6.txt yang berarti bahwa kami telah mengevaluasi$((++i))
dalam subshell, dan eksekusils
dengan stdout-nya diatur ke file itu.Akhirnya, kita melihat bahwa subproses keluar, kita menuai anak, lalu kita lanjutkan dengan tempat kita tinggalkan ... dengan
$i
set ke 5, dan itulah yang kita gema lagi.(Ingat perubahan variabel dalam suatu subproses tidak meresap ke proses induk, kecuali jika Anda melakukan sesuatu secara eksplisit pada induk untuk mengambil perubahan anak)
sumber
i=5; j=$(( i + 1 )); ls file_a-${i}.txt file_b-${i}.txt > file_c-${j}.txt; i=${j}; echo $i
.