Neden bu iki 'kedi' komutu farklı sonuç veriyor?


12

Diyelim ki dosya belirli bir metin içeriyor ve ben aşağıdaki komutları yürütecektim:

exec 3<infile

kedi -n <&3

kedi -n <&3

Cat'in ilk örneği dosyanın içeriğini görüntüler, ancak ikinci kez hiçbir şey yapmıyor gibi görünüyor. Neden farklılar?

Yanıtlar:


29

Aynı komuta benziyorlar, ancak farklı olmalarının nedeni, ilk komutun sonucu olarak sistem durumunun değişmiş olması. Özellikle, birincisi cattüm dosyayı tüketir, böylece ikincisinin catokunacak hiçbir şeyi kalmaz, EOF'ye (dosya sonu) hemen vurur ve çıkar.

Bunun nedeni , her iki çağrı için de aynı dosya tanımını (dosya tanımlayıcıyla oluşturduğunuz exec < infileve dosya tanımlayıcıya atadığınız dosya 3) kullanmanızdır cat. Açık bir dosya açıklamasıyla ilişkili şeylerden biri dosya ofseti. Böylece, birincisi cattüm dosyayı okur, en sonda ofseti bırakır ve ikincisi dosyanın sonundan almaya çalışır ve okunacak hiçbir şey bulamaz.


12

Sadece @ jw013'ün iyi cevabına eklemek, bunun aynı olduğunu fark etmeye yardımcı olabilir.

{
   cat -n
   cat -n
} < infile

< filekısaca 0< file, 3 yerine 0 dosya tanımlayıcısını kullanın.

Ve sadece konuyu biraz karıştırmak için, bu sürüm:

exec 3< infile
cat -n /dev/fd/3
cat -n /dev/fd/3

Davranacağını farklı şekilde de çalıştırmak OS ve bağlı tip ait infile(cihazın vs boru vs düzenli dosyası ...)

Solaris ve çoğu ticari Unices'te, a open("/dev/fd/3"), a veya daha fazlasıyla eşdeğerdir dup(3)(yani < /dev/fd/3yaklaşık olarak aynıdır <&3), Linux'ta ise normal dosyalar /dev/fd/3için orijinal dosyaya bir sembolik bağlantı olarak uygulanır, bu yüzden open("/dev/fd/3")baştan yeniden açar ( ve muhtemelen fd 3'ten farklı bayraklarla).

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.