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
shell
io-redirection
read
Gaurav
sumber
sumber
Jawaban:
Script membaca pasangan string dari dua file. Di setiap iterasi, ia membaca string dari
file11
kelineA
, dan darifile22
kelineB
. Ia melakukan ini sampai menemukan akhir dari kedua file. Tubuh loop menghasilkan dua string dan garis kosong.The
<file11
berarti "connect / mengarahkan standar input darifile11
dalam perintah ini", di mana "perintah ini" adalahwhile
lingkaran. Ini juga bisa ditulis0<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 untukfile22
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 filefile11
(input standar diwarisi dari loop). Ini juga bisa ditulisread lineA <&0
.Dengan
read lineB <&3
,read
perintah membaca dari file deskriptor 3, yaitu darifile22
, 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
, gunakanTerkait:
sumber
3<file22
seperti difopen
manaFID
tidak dikembalikan tetapi ditentukan sebelumnya?fdopen()
. Iya.