
Não entendo por que * retorna quando não há correspondência. Esseresponderafirma que este é o caso, mas não entendo a razão para este comportamento. Por que *, ou qualquer padrão genérico, simplesmente não retorna uma string vazia em caso de não correspondência?
$ls # Look, no files
$touch a # Add a file
$echo * # Works as expected
a
$rm a # Remove the file
$echo * # Will output a '*'. Why not ''?
*
$* # Ok, * will fail, but how come the previous output?
-bash: *: command not found
$
Responder1
Padrões que não correspondem a nenhum arquivo são considerados um erro. Você pode ver isso nas primeiras versões do Unix.
globoimprimiria um erro e o comando que foi passado nunca seria executado.
A mensagem de erro foi"Sem correspondência".
Em seu shell moderno derivado deBourne (Unix versão 7), ls -l *.c
geraria o erro "*.c: Nenhum arquivo ou diretório". Eu diria que esta mensagem é mais fácil de entender; também indica o padrão que falhou.
Observe que se *.c
foi expandido para vazio, ls -l *.c
mostraria todos os arquivos no diretório e não imprimiria nenhum erro.
bash tem uma failglob
opção de comportamento mais próximo do original.
Responder2
O * está na verdade sendo expandido pelo bash (qualquer que seja o seu shell) e então é passado para oeco. Oecocomando não faz nada além de imprimi-lo na saída padrão. Leia este documento -Expansão do nome do arquivo. Diz-
Bash verifica cada palavra em busca dos caracteres "*", "?" e "[". Se um desses caracteres aparecer, a palavra será considerada um PADRÃO e substituída por uma lista ordenada alfabeticamente de nomes de arquivos que correspondam ao padrão. Se nenhum nome de arquivo correspondente for encontrado e a opção shell nullglob estiver desabilitada, a palavra permanecerá inalterada. Se a opção nullglob estiver definida e nenhuma correspondência for encontrada, a palavra será removida.
Então, na verdade, quando o bash não consegue encontrar nenhuma correspondência, ele deixa '*' inalterado e echo imprime isso.
Razão
A razão pela qual o bash não retorna uma instrução vazia por padrão é que pode haver casos em que o usuário não deseja usar o '*' como curinga e, portanto, não precisa da expansão de '*'. E, portanto, neste caso, expandir o '*' para uma string vazia seria errado. No entanto, este comportamento padrão pode ser substituído por nullglob
opção.