Saya memiliki skrip berikut:
while read lineA && read lineB <&3
do
echo "$lineA"
echo "$lineB"
echo
done < file11 3< file22
Kode ini berfungsi dengan baik. Tapi saya tidak mengerti ini:
<&3
done < file11 3< file22
Saya memiliki skrip berikut:
while read lineA && read lineB <&3
do
echo "$lineA"
echo "$lineB"
echo
done < file11 3< file22
Kode ini berfungsi dengan baik. Tapi saya tidak mengerti ini:
<&3
done < file11 3< file22
Jawaban:
Script membaca pasangan string dari dua file. Di setiap iterasi, ia membaca string dari file11
ke lineA
, dan dari file22
ke lineB
. Ia melakukan ini sampai menemukan akhir dari kedua file. Tubuh loop menghasilkan dua string dan garis kosong.
The <file11
berarti "connect / mengarahkan standar input dari file11
dalam perintah ini", di mana "perintah ini" adalah while
lingkaran. Ini juga bisa ditulis 0<file11
.
Input standar adalah nomor deskriptor file 0. Deskriptor file 1 dan 2 dicadangkan untuk output standar dan stream kesalahan standar.
The 3<file22
berarti "connect file descriptor 3 untuk file22
untuk perintah ini". Angka 3 kebetulan merupakan nomor deskriptor file "bebas" berikutnya, tetapi kode tersebut dapat menggunakan 4 atau 5 atau bilangan bulat kecil selain 0, 1 dan 2 sebagai gantinya (batas nomor deskriptor file yang dapat digunakan tergantung pada apa shell adalah sedang digunakan, tetapi nomor hingga 9 dijamin berfungsi).
Dalam loop, read lineA
akan membaca string dari input standar secara default, yaitu dari file file11
(input standar diwarisi dari loop). Ini juga bisa ditulis read lineA <&0
.
Dengan read lineB <&3
, read
perintah membaca dari file deskriptor 3, yaitu dari file22
, bukan dari input standar (file deskriptor 3 tersedia di loop, sama seperti input standar).
Singkatnya, ia menggunakan aliran input standar dan deskriptor file "ekstra" (nomor 3) untuk membaca dari dua file "secara bersamaan" (string pada satu waktu dari masing-masing file pada gilirannya). Biasanya, satu hanya memiliki akses ke satu aliran input, tetapi ini memotong pembatasan itu dengan secara eksplisit membuat aliran input kedua dan menghubungkannya ke file22
file.
Terkait:
Saya menggunakan kata "string" di atas daripada "baris". Hal-hal yang dibaca dari dua file akan memiliki spasi putih mengapit dilucuti, dan urutan pelarian tertentu akan ditafsirkan secara khusus.
Untuk membaca baris menggunakan read
, gunakan
IFS= read -r varname
Terkait:
3<file22
seperti di fopen
mana FID
tidak dikembalikan tetapi ditentukan sebelumnya?
fdopen()
. Iya.