C'est vraiment historique, et pas très important si vous ne faites que cloner un disque sur un autre.
Sur Unix traditionnel, les disques étaient accessibles à la fois par des périphériques de blocs et des périphériques de caractères, et chacun avait des exigences différentes. Le programme " dd " était nécessaire pour interagir avec les périphériques blocs, car " cat " ne connaissait que les E/S de caractères. (Les E/S par bloc étaient particulièrement importantes pour gérer efficacement des choses comme les lecteurs de bandes).
dd peut être pratique si vous devez relancer une copie de longue durée, grâce à ses options de saut et de recherche.
À moins que vous ne soyez sur un système qui utilise encore la distinction bloc/caractère pour l'accès au disque (ce qui n'est pas le cas de Linux), et à moins que vous n'ayez besoin de faire quelque chose comme échanger des octets, 'cat' sera parfait (et probablement plus rapide, car il utilisera par défaut des tailles de blocs plus grandes que dd).
Notez que, à moins que quelqu'un n'ait fait des modifications majeures dans la conception du shell depuis la dernière fois que j'ai regardé, 'cat foo >bar' fait no effectuer l'écriture dans 'bar' via l'interpréteur de commandes ; tout ce que fait l'interpréteur de commandes est d'ouvrir 'bar' pour l'écriture avec troncature, puis de passer le descripteur de fichier ouvert à 'cat' à travers un fork/exec comme descripteur de fichier 1 (stdout). À ce stade, l'interpréteur de commandes est hors de la boucle et n'intervient plus, si ce n'est pour être informé de l'état de sortie de 'cat'.