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.