Nedávno jsem si uvědomil, že můžeme použít cat
stejně jako dd
a ve skutečnosti je rychlejší než dd
Vím, že dd
byl užitečný při práci s páskami, kde na velikosti bloku skutečně záleželo správnost, nejen výkon. V dnešní době však existují situace, kdy dd
může něco udělat cat
nemůže? (Zde bych považoval méně než 20% rozdíl ve výkonu za irelevantní.)
Konkrétní příklady by byly hezké!
Přijatá odpověď:
Ve vzhledu dd
je nástroj z operačního systému IBM, který si zachoval svůj cizí vzhled (předávání parametrů), který provádí některé velmi zřídka používané funkce (např. konverze EBCDIC na ASCII nebo obrácení endianness… není v dnešní době běžná potřeba).
Dříve jsem si myslel, že dd
byl rychlejší pro kopírování velkých bloků dat na stejný disk (kvůli efektivnějšímu využití vyrovnávací paměti), ale to není pravda, alespoň na dnešních systémech Linux.
Myslím, že některé z dd
Možnosti jsou užitečné při práci s páskami, kde se čtení skutečně provádí v blocích (ovladače pásek neskryjí bloky na paměťovém médiu tak, jak to dělají ovladače disků). Ale neznám podrobnosti.
Jedna věc dd
lze to udělat nelze (snadno) provést žádným jiným nástrojem POSIX zabírá prvních N bajtů proudu. Mnoho systémů to umí pomocí head -c 42
, ale head -c
, ačkoli je běžný, není v POSIX (a dnes není dostupný např. na OpenBSD). (tail -c
je POSIX.) Také, i když head -c
existuje, může číst příliš mnoho bajtů ze zdroje (protože interně používá ukládání do vyrovnávací paměti stdio), což je problém, pokud čtete ze speciálního souboru, kde má vliv pouhé čtení. (Aktuální GNU coreutils čtou přesný počet pomocí head -c
, ale FreeBSD a NetBSD používají stdio.)
Obecněji dd
poskytuje rozhraní pro základní souborové API, které je jedinečné mezi unixovými nástroji:pouze dd
může přepsat nebo zkrátit soubor v libovolném bodě nebo hledat v souboru. (Toto je dd
‚jedinečná schopnost, a je to velká; kupodivu dd
je nejlépe známý pro věci, které mohou dělat jiné nástroje.)
- Většina unixových nástrojů přepíše svůj výstupní soubor, tj. vymaže jeho obsah a spustí jej od začátku. To se stane, když použijete
>
přesměrování také v shellu. - K obsahu souboru můžete připojit pomocí
>>
přesměrování v shellu nebo pomocítee -a
. -
Pokud chcete zkrátit soubor odstraněním všech dat po určitém okamžiku , toto je podporováno základním jádrem a C API prostřednictvím
truncate
funkce, ale není vystavena žádným nástrojem příkazového řádku kromědd
:dd if=/dev/null of=/file/to/truncate seek=1 bs=123456 # truncate file to 123456 bytes
-
Pokud chcete přepsat data uprostřed souboru, opět je to možné v podkladovém API otevřením souboru pro zápis bez zkrácení (a voláním
lseek
v případě potřeby přesunout na požadovanou pozici), ale pouzedd
může otevřít soubor bez zkrácení nebo připojení, nebo hledat z shellu (složitější příklad).# zero out the second kB block in the file (i.e. bytes 1024 to 2047) dd if=/dev/zero of=/path/to/file bs=1024 seek=1 count=1 conv=notrunc
Takže... Jako systémový nástroj dd
je celkem k ničemu. Jako nástroj pro zpracování textu (nebo binárního souboru) je to docela cenné!