GNU/Linux >> Znalost Linux >  >> Linux

Proč (a jak) používání Cat na binárních souborech zkazilo terminál?

Pokud rozumím cat manuál správně:

zřetězit soubory a vytisknout na standardní výstup

cat vezme soubory jako argument a vytiskne je na standardní výstup.
Co nedostanu, je, když použiji příkaz:

cat img.png > copy.png

Získám 2 identické soubory png, zatímco když jen

cat img.png  

Mám velkou šanci, že se můj terminál zkazí a špatně si vyloží, co píšu.

  • Jak je to možné?
  • Binární hodnoty jsou stále binární data. Proč jednoduše neukazuje řadu 0 a 1 nebo interpretaci těchto binárních dat v ASCII nebo v jakémkoli jiném kódování v terminálu?
  • Je toto chování možné také u cat? textový soubor obsahující podivné znaky?
  • Měl by být implementován mechanismus, který tomuto chování zabrání, jako je příkaz try{}catch{}?

Přijatá odpověď:

cat zřetězí soubory zadané jako argumenty na příkazovém řádku na standardní výstup, čte bajty najednou a ve výchozím nastavení neprovádí žádnou interpretaci přečtených bajtů.

Ve vašem prvním příkladu přesměrováváte stdout na soubor, proto získáte nový soubor.

Ve vašem druhém příkladu se bajty zapisují do terminálu a je to terminál, který interpretuje sekvence znaků jako řídicí sekvence pro terminál, proto se na vašem terminálu chová neobvyklé chování. Nemá to nic společného s cat jako takový, cat neví, co s jeho výstupem uděláte. Možná jej posíláte potrubím do jiného programu, který jej interpretuje/zpracuje/vytiskne nebo přehraje „Zpívání v dešti“.

Takže podle unixové filozofie

dělat jednu věc, dělat jen jednu věc, ale dělat to dobře

cat neměli byste se pokoušet odhadnout, co se snažíte udělat.

upravit 1 odpověď na 1. komentář @kiwy níže.

Ano a ne, dovolte mi to vysvětlit,

Ne, pokud cat do terminálu, protože ten (software terminálu) posílá výstup na vaši obrazovku nebo interpretuje řídicí sekvence (emuluje starý kus hardwaru, např. dálnopisné zařízení ).

ale,

Ano, pokud kočujete do potrubí a přijímající program může interpretovat znaky jako příkazy.

Související:Získat seznam všech souborů podle masky v terminálu?

podívejte se na příklad, cat anyOldShellScript | bash bash bude to, co získá, interpretovat jako příkazy.


Linux
  1. Odstraňte soubory a složky v terminálu Linux

  2. Jak šifrovat a dešifrovat soubory a adresáře pomocí Tar a OpenSSL

  3. wget vs curl:Jak stahovat soubory pomocí wget a curl

  1. Jak odstranit adresáře a soubory pomocí Linuxu

  2. Jak komprimovat a extrahovat soubory pomocí příkazu tar v systému Linux?

  3. Jak zkontrolovat OS a verzi pomocí příkazu Linux

  1. Jak odstranit soubory a adresáře pomocí příkazového řádku systému Linux

  2. Jak vyhledávat soubory z terminálu v systému Linux

  3. Jak zálohovat a obnovovat soubory pomocí Deja Dup v Linuxu