bash (ou o que você usa como shell), é a primeira coisa a ler qualquer entrada, e vai começar a interpretar caracteres especiais como ?
e *
. *
é expandido para as correspondências no CWD , o que significa que o asterisco é substituído pelas correspondências mencionadas.
Na maioria dos casos, isso é bastante difícil, mas pode levar a alguns casos confusos de tempos em tempos.
Considere o seguinte. Um diretório tem este conteúdo:
- teste (arquivo regular)
- test1 (diretório)
- test2 (diretório)
- test3 (diretório)
Se você digitar mv *
, algo aparentemente estranho acontece: test3
está lá, mas o resto desapareceu. Apesar de estranho no começo, faz sentido quando você entende o que o bash realmente passa para mv
. Por causa do asterisco, bash interpreta mv *
como mv test test1 test2 test3
, e quando mv pega essa lista, assume que o último argumento é o destino, onde todos os arquivos foram movidos.
Quanto aos comandos que você listou:
-
echo *
pode funcionar como um pobrels
. O shell expandirá o asterisco para o que estiver nesse diretório e, como eu tenho certeza que você já sabe,echo
irá literalmente fazer eco de qualquer coisa que o bash passou para ele como argumentos. -
cp temp temp*
se comportará um pouco como o comandomv
que descrevi acima, a menos que exista apenas um diretório chamado temp. Nesse caso, o nome da origem e do destino será o mesmo, ou seja, não fará nada.