“<& 3” ve “done <file11 3 <file22” ne anlama geliyor?


16

Aşağıdaki komut dosyası var:

while read lineA && read lineB <&3
do
    echo "$lineA"
    echo "$lineB"
    echo
done < file11 3< file22

Bu kod iyi çalışıyor. Ama bunları anlamıyorum:

  • <&3
  • done < file11 3< file22

1
Senaryonun ne yaptığını açıklar mısınız? (İyi çalıştığını söylüyorsun)
Mathieu

Yanıtlar:


22

Komut dosyası iki dosyadan dize çiftlerini okur. Her yineleme, bu bir dize okur file11INTO lineAve gelen file22içine lineB. Her iki dosyanın sonuna gelene kadar bunu yapar. Döngünün gövdesi iki dizeyi ve boş bir çizgi çıkarır.

<file11Aracı "bağlantı / standart giriş yönlendirme file11"bu komutu" ise, bu komutta" whiledöngü. Bu da yazılabilirdi 0<file11.

Standart girdi, dosya tanımlayıcı numarası 0'dır. Dosya tanımlayıcıları 1 ve 2, standart çıktı ve standart hata akışları için ayrılmıştır.

3<file22Aracı "ile bağlantı dosya tanımlayıcı 3 file22bu komut için". 3 sayısı bir sonraki "boş" dosya tanımlayıcı numarası olur, ancak kod 4 veya 5 veya 0, 1 ve 2 dışında herhangi bir küçük tamsayı kullanmış olabilir (kullanılabilir dosya tanımlayıcı numaralarının sınırı hangi kabuğa bağlıdır? kullanılır, ancak 9'a kadar olan sayıların çalışması garanti edilir).

Döngüde, read lineAvarsayılan olarak standart girdiden, yani dosyadan file11(standart giriş döngüden devralınır) bir dize okuyacaktır . Bu da yazılabilirdi read lineA <&0.

İle read lineB <&3, readkomut dosya tanımlayıcı 3'ten, yani file22standart girdi yerine okur (dosya tanımlayıcı 3, standart girdi gibi döngüde kullanılabilir).

Kısacası, iki dosyadan "aynı anda" (sırayla her bir dosyadan bir seferde bir dize) okumak için standart giriş akışını ve "ekstra" bir dosya tanımlayıcıyı (sayı 3) kullanır. Genellikle, yalnızca bir giriş akışına erişim vardır , ancak bu açıkça ikinci bir giriş akışı oluşturarak ve bunu file22dosyaya bağlayarak bu kısıtlamayı atlar .

İlişkili:


"Line" yerine "string" kelimesini kullanıyorum. İki dosyadan okunan şeyler, beyaz boşluklar çıkarılmış olacak ve bazı kaçış dizileri özel olarak yorumlanacaktır.

Tuşlarını kullanarak bir satır okumak readiçin

IFS= read -r varname

İlişkili:


İyi cevap! Anlamadığım dosya tanımlayıcı 3'ün nasıl kullanılabileceği. Bundan daha anlamına mı geliyor 3<file22bir gibidir fopennerede FIDdöndü ama önceden belirtilmemiştir?
A. Donda

2
@ A.Donda Tarif ediyorsunuz fdopen(). Evet.
Kusalananda
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.