Apa arti dari "<& 3" dan "selesai <file11 3 <file22"

16

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
Gaurav
sumber
1
Bisakah Anda menjelaskan kepada kami apa naskahnya? (Anda mengatakan itu berfungsi dengan baik)
Mathieu

Jawaban:

22

Script membaca pasangan string dari dua file. Di setiap iterasi, ia membaca string dari file11ke lineA, dan dari file22ke lineB. Ia melakukan ini sampai menemukan akhir dari kedua file. Tubuh loop menghasilkan dua string dan garis kosong.

The <file11berarti "connect / mengarahkan standar input dari file11dalam perintah ini", di mana "perintah ini" adalah whilelingkaran. 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<file22berarti "connect file descriptor 3 untuk file22untuk 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 lineAakan 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, readperintah 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 file22file.

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:

Kusalananda
sumber
Jawaban yang bagus! Yang tidak saya mengerti adalah bagaimana file deskriptor 3 dapat digunakan. Apakah ini berarti daripada 3<file22seperti di fopenmana FIDtidak dikembalikan tetapi ditentukan sebelumnya?
A. Donda
2
@ A.Donda Anda jelaskan fdopen(). Iya.
Kusalananda