Você pode usar o próprio vi para fazer a cópia, abrindo a.txt, em seguida, salvando o conteúdo em b.txt (copiando-o efetivamente) e, em seguida, alternando para b.txt.
Colocando tudo junto:
vi -c 'w b.txt' -c 'e#' a.txt
Isso equivale a executar vi a.txt
, seguido pelo comando :w b.txt
(dentro de vi
), que salvará o conteúdo em um arquivo chamado b.txt. Mas o vi ainda estará editando a.txt neste ponto, então você segue com o comando :e#
, que significa "editar arquivo alternativo" (ou "editar último arquivo") e dado que o vi acabou de tocar b.txt, mudará para a edição desse arquivo.