cat <<EOS | sed -ne '1{h;d;}' -e 'H;${G;p;}'
line 1
line 2
line 3
EOS
Bir şeye bu tercüme ile sorunu kullanımları olduğu tailolmasıdır tailihtiyaçları, sonunu bulmak için tüm dosyayı okumak için. Bunu boru hattınızda kullanmak için,
- Adlı dokümanın tüm içeriğini sağlayın
tail.
- Bunu sağlamak tekrar etmek
cat.
- Bu sırayla.
Zor bit, belgenin içeriğini çoğaltmak değil ( teebunu yapar), ancak tailara geçici bir dosya kullanmadan, belgenin geri kalanının çıktısı alınmadan çıktısının gerçekleşmesini sağlamaktır.
Kullanılması sed(ya awkolduğu gibi, John1024 yapar ) bellekteki verileri depolayarak veri ve sipariş sorununun çifte ayrıştırma kurtulmak alır.
sedBen önermesi çözüm etmektir
1{h;d;}, ilk satırı olduğu gibi muhafaza alanında saklayın ve sonraki satıra atlayın.
H, gömülü bir yeni satırla birbirini bekletme alanına ekleyin.
${G;p;}, tutma alanını katıştırılmış yeni satırla son satıra ekleyin ve elde edilen verileri yazdırın.
Bu içine John1024 çözeltisinin oldukça değişmez çevirisidir sedPOSIX standardı sadece tutma alanı KiB diye de 8192 bayt (8 olduğunu garanti eder uyarı ile, fakat bu önerir , gerektiği gibi, bu tampon dinamik olarak tahsis edilmiş ve genişletilir bunların her ikisi de GNU'yu sedve BSD sedyapıyor).
Adlandırılmış bir kanal kullanmanıza izin verirseniz:
mkfifo mypipe
cat <<EOS | tee mypipe | cat <( tail -n 1 mypipe ) -
line 1
line 2
line 3
EOS
rm -f mypipe
Bu tee, verileri aşağı mypipeve aynı zamanda göndermek için kullanır cat. catProgramı ilk kez çıktı okuyacaktır tail(okur mypipe, teeyazıyor) ve sonra doğrudan gelen belgenin kopyasını ekleyin tee.
Bununla birlikte, belgede çok büyükse (borunun tampon boyutundan daha büyük), (isimsiz) borunun boşalmasını beklerken teeyazıyor mypipeve catengelliyor. Ondan okunana kadar boşaltılamaz cat. catbitene kadar tailondan okumazdı . Ve tailbitene kadar teebitirmezdi. Bu klasik bir kilitlenme durumudur.
Varyasyon
tee >( tail -n 1 >mypipe ) | cat mypipe -
aynı sorunu yaşıyor.