tl; Dr.
Hayır >>
, temelde "her zaman dosyanın sonunu ara" >
, son yazılan konuma bir işaretçi tutar.
Tam cevap
(Not: tüm testlerim Debian GNU / Linux 9'da yapıldı).
Başka bir farklılık
Hayır, eşdeğer değiller. Orada başka farkı. Hedef dosyanın önceden var olup olmamasından bağımsız olarak kendini gösterebilir.
Bunu gözlemlemek için, veri üreten bir işlemi çalıştırın ve >
veya >>
(örneğin pv -L 10k /dev/urandom > blob
) ile bir dosyaya yönlendirin . Çalıştırmasına ve dosyanın boyutunu değiştirmesine izin verin (örn truncate
. İle ). Her zaman sona >
eklenirken (büyüyen) ofsetini koruduğunu göreceksiniz >>
.
- Dosyayı daha küçük bir boyuta keserseniz (sıfır boyutta olabilir)
>
umursamayacak, hiçbir şey olmamış gibi istediği şekilde yazacak; ofsetin kesilmesinden hemen sonra, dosyanın sonunun ötesine geçmesi, bu dosyanın eski boyutunu geri kazanmasına ve daha da büyümesine neden olur; eksik veriler sıfırlarla (mümkünse seyrek) sıfırlarla doldurulur;
>>
yeni sona eklenecek, dosya kesilmiş boyutundan itibaren büyüyecek.
- Dosyayı büyütürseniz
>
umursamayacak, hiçbir şey olmamış gibi istediği şekilde yazacak; boyutu değiştirdikten hemen sonra ofset, dosyanın içinde bir yerdedir; bu, ofset yeni sonuna ulaşana kadar dosyanın bir süre büyümesini durduracaktır, ardından dosya normal şekilde büyür;
>>
yeni sona eklenecek, dosya büyütülmüş boyutundan büyüyecek.
Başka bir örnek, >>
veri oluşturma işlemi çalışırken ve dosyaya yazarken, (ayrı olarak ) ekstra bir şeyler eklemektir. Bu, dosyayı büyütmeye benzer.
- Üretme işlemi
>
, istenen ofsette yazacak ve sonunda ilave verilerin üzerine yazacaktır.
- Oluşturma işlemi
>>
yeni verileri atlayacak ve ekleyecektir (yarış durumu oluşabilir, iki akış birleştirilebilir, yine de hiçbir verinin üzerine yazılmamalıdır).
Örnek
Uygulamada önemli mi? Orada bu soru :
Stdout'ta çok fazla çıktı üreten bir işlem yürütüyorum. Hepsini bir dosyaya gönderme [...] Bir tür günlük döndürme programı kullanabilir miyim?
Bu cevap çözüm olduğunu söylüyor logrotate
ile copytruncate
bu gibi davranır seçeneği:
Eski günlük dosyasını taşımak ve isteğe bağlı olarak yeni bir tane oluşturmak yerine, bir kopya oluşturduktan sonra orijinal günlük dosyasını yerinde kesin.
Yukarıda yazdıklarıma göre, yeniden yönlendirmek >
kesilmiş kütüğü çok kısa sürede büyütecektir. Seyreklik günü kurtaracak, kayda değer disk alanı israf edilmemelidir. Bununla birlikte, her ardışık kütüğün içinde, tamamen gereksiz olan, gittikçe daha fazla sayıda lider sıfır olacaktır.
Ancak logrotate
, seyreklikten korunmaksızın kopyalar yaratırsa, bu baştaki sıfırların her kopya yapıldığında daha fazla disk alanına ihtiyacı olacaktır. Takımın davranışını araştırmadım, hareket halindeyken seyreklik veya sıkıştırma ile yeterince akıllı olabilir (eğer sıkıştırma etkinse). Yine de sıfırlar yalnızca soruna neden olabilir veya en iyi ihtimalle nötr olabilir; içlerinde iyi bir şey yok.
Bu durumda, >>
yerine >
hedef dosya henüz oluşturulacak olsa bile, bunun kullanılması önemli ölçüde daha iyidir.
Verim
Gördüğümüz gibi, iki operatör yalnızca başladığında değil, sonra da farklı davranıyor. Bu, bazı (ince?) Performans farkına neden olabilir. Şimdilik bunu destekleyecek ya da ispatlayacak anlamlı bir test sonucum yok, ancak performanslarının genel olarak aynı olduğunu varsaymamanız gerektiğini düşünüyorum.
>>
, esasen “her zaman dosyanın sonunu ara”>
, son yazılan konuma işaretçi tutar. Çalışma biçimlerinde bazı ince performans farkları var gibi görünüyor ...