Standart giriş ve çıkışı ikili verilerle kullanmak güvenli midir?


14

İkili bir dosyayı ikiye bölmem gerekiyor. Kafa ve / veya kuyruk kullanılabilir mi merak ediyordum ama sonra merak ettim ... İkili verilerle yönlendirme, borulama vb kullanmak güvenli mi? Yeni satırlar karışıyor mu yoksa yok sayılıyor mu yoksa geri al veya sil özel bir şey mi yapıyor? (bash, kubuntu 18.04 LTS)


1
splitKomuta bir göz atın .
egmont

Yanıtlar:


19

Evet, başka bir işleme bağlarsanız veya bir dosyaya kaydederseniz güvenlidir. İkili stdout'un bir terminale yazdırmasına izin verirseniz, terminal ekranını geçici olarak bozabilecek kaçış dizileri (rastgele) içerebileceğinden potansiyel "tuhaflık" vardır.


6
Bu durumda reset, düzeltmek için yazıp enter tuşuna basabilirsiniz.
Baard Kopperud

4
@BaardKopperud Ben tset / reset çalışmaz bazı köşe durumlarda hakkında bir yerde okudum düşündüm
Xen2050

1
@ Xen2050 Bilmiyorum. Bazı kaçış dizisi klavye düzenini / kodlamasını değiştirirse tek durum budur, böylece yazım reset<enter> aslında terminal tarafından görüldüğü gibi karakter dizisini
yazmaz

3
Ayrıca bkz ikili dosyayı görüntüleyen sonra terminali Fix ve neden bazen konsol ihtiyacını CTRL + C sonra sıfırlama yapar . İlk bağlantıda önerildiği gibi stty sane; tput rs1, komut dizisi resetçalışmayan köşe vakaları olduğunda hile yapacaktır . Bu tür durumlar, Bakuriu tarafından belirtildiği gibi, terminal hattının / sütunlarının genişliğini içerebilir veya seri iletişim (baudrate / parity) ile ilgili ayarları tahmin ediyorum.
Sergiy Kolodyazhnyy

1

headVeya gibi komutları kullanmanın temel sorunu tail, satır yönelimli ve ikili dosyaların olmamasıdır. İçlerinde yeni satırlar varsa, genellikle bir satırın sonunu temsil etmek için kullanılmazlar ve eğer öyleyse, sadece program mesajları veya veri alanları gibi dizelerin bir parçası olabilirler.

Veriler herhangi bir şekilde yapılandırılmışsa, o zaman bölme noktalarını seçerken bunu dikkate almanız gerekir, böylece ortadaki yapıları kırmazsınız.

Dosyanın yapısını biliyorsanız, aşağıdaki gibi bir komut kullanabilirsiniz:

dd -if input-file -of output-file ...

yalnızca belirli bir boyuttaki çok sayıda veri bloğunu belirli bir (artan) ofsetten başlayarak dosyaya kopyalama seçenekleriyle.

Öyle görünüyor splitsizin için bu işlemi otomatik olacak @egmont tarafından belirtildiği gibi komutu, ancak ek seçenekleri belirtmek gerekir böylece, hat odaklı varsayılan olarak görünüyor gibi --bytes countne kadar büyük dosyasının her parçası olmalıdır anlatmamız olmak.


Bir yan not olarak, bir dosyada ne olduğunu bilmiyorsanız, ancak en azından bazı anlamlı metin verileri içerdiğinden şüpheleniyorsanız, stringskomut, neyle uğraştığınızı görmek için ilk kez bakmanın harika bir yoludur.

strings -n 6 file | less

yazdırılabilir karakterlerin tüm çalışmalarını en az altı karakter uzunluğunda bulur ve terminalde uçmamaları için bir çağrı cihazında görüntüler. Varsayılan 4 karakterden biraz daha büyük bir sayı kullanmak, yazdırılabilir olan ancak dosyada bu şekilde kullanılmayan küçük veri snippet'lerinin ortadan kaldırılmasına yardımcı olur.

Daha sonra dosyayı ikili düzenleyici ile daha ayrıntılı olarak keşfetmek zorunda hexeditkalırsanız, ilginç bir şeyin nerede bulunabileceğini gösteren bazı yer işaretlerine sahip olursunuz.

stringsbir seçeneğe sahiptir - t x her yazdırılan dizenin ofseti ile birlikte onaltılı sayıya gelir (ondalık için sekizlik / d için), böylece daha sonra nerede bulacağınızı bilirsiniz. Çok kısa dosyalar bile onlara karakter karakter bakmak zorunda kaldığınız zaman uğraşmak için çok şey var.

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.