Isso não é um bug, é o comportamento pretendido para a expressão de variável de shell.
Como ulrich-schwarz afirmou corretamente, a expansão da variável acontece antes que o comando cp
seja executado. Você tem dois arquivos que atendem à condição de expresion abc*
e, portanto, são expandidos para seus nomes completos.
De fato, se você criar um terceiro arquivo abc.3.txt
, ele tentará usar os três arquivos como parâmetros para cp
.
Você pode verificar tudo isso se definir o modo de depuração ( set -x
) antes de executar o comando, que mostra cada comando real à medida que é executado, após a expansão ocorrer. Lembre-se de desativar o modo de depuração ( set +x
) quando terminar.
$ echo "aaa" >abc.1.txt
$ echo "bbb" >abc.2.txt
$ ls
abc.1.txt abc.2.txt
$ set -x
$ cp abc*
+ cp abc.1.txt abc.2.txt
$ cat abc.2.*
+ cat abc.2.txt
aaa
$echo "ccc" > abc.3.txt
+ echo ccc
$ cp abc*
+ cp abc.1.txt abc.2.txt acb3.txt
cp: target «acb3.txt» is not a directory
$ cat abc.2.*
+ cat abc.2.txt
aaa
$ cat abc*
+ cat abc.1.txt abc.2.txt abc.3.txt
aaa
aaa
ccc
$ set +x
+ set +x