Se você não tiver um arquivo no diretório atual cujo nome começa com uma barra invertida, esse é o comportamento esperado. Bash expande *
para corresponder a qualquer nome de arquivo existente, mas :
If the pattern does not match any existing filenames or pathnames, the pattern string shall be left unchanged.
Como não havia nome de arquivo começando com \
, o padrão foi deixado como está e echo
recebe o argumento \*
. Esse comportamento é geralmente confuso, e alguns outros shells, como zsh
, não o possuem. Você pode alterá-lo no Bash usando shopt -o failglob
, que será então dê um erro como zsh
e ajude-o a diagnosticar o problema em vez de se comportar mal.
Os caracteres de padrão *
e ?
podem aparecer em qualquer parte da palavra e os caracteres antes e depois são correspondidos literalmente. É por isso que echo \*
e echo \ *
fornecem uma saída tão diferente: a primeira corresponde a qualquer coisa que inicie com \
(e falha) e a segunda gera um \
e, em seguida, todos os nomes de arquivos.
A maneira mais direta de obter a saída desejada com segurança é provavelmente usar printf :
printf '\'; printf "%s " *
echo *
não é seguro no caso de nomes de arquivos incomuns com -
ou \
em nenhum caso.