Bash: Por que * não retorna uma string vazia em caso de não correspondência

Bash: Por que * não retorna uma string vazia em caso de não correspondência

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 *.cgeraria 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 *.cfoi expandido para vazio, ls -l *.cmostraria todos os arquivos no diretório e não imprimiria nenhum erro.

bash tem uma failglobopçã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 nullglobopção.

informação relacionada