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

1

Eu não entendo porque * retorna quando não há correspondência. Essa resposta afirma que esse é o caso, mas não entendo a justificativa para esse comportamento. Por que o *, ou qualquer padrão genérico, apenas 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
$
    
por Fredrik Johansson 01.11.2016 / 18:28

2 respostas

1

O * na verdade está sendo expandido pelo bash (qualquer que seja o seu shell) e então é passado para o echo . O comando echo não faz nada além de imprimi-lo na saída padrão. Leia este documento - Expansão do nome do arquivo . Diz-se

Bash scans each word for the characters "*", "?", and "[". If one of these characters appears, then the word is regarded as a PATTERN, and replaced with an alphabetically sorted list of file names matching the pattern. If no matching file names are found, and the shell option nullglob is disabled, the word is left unchanged. If the nullglob option is set, and no matches are found, the word is removed.

Então, na verdade, quando o bash não consegue encontrar qualquer correspondência, ele deixa '*' inalterado e o echo imprime isso.

Razão A razão pela qual o bash não retorna uma instrução vazia por padrão, pois pode haver casos em que o usuário não queira usar o '*' como caractere curinga e, portanto, ele não precisa da expansão de '*'. E, portanto, nesse caso, expandir o '*' para uma string vazia seria errôneo. No entanto, esse comportamento padrão pode ser substituído pela opção nullglob .

    
por 01.11.2016 / 18:48
4

Padrões que não correspondem a nenhum arquivo são considerados um erro. Você pode ver isso nas primeiras versões do unix.

glob imprimia um erro, e o comando para o qual foi passado seria nunca seja executado.

A mensagem de erro foi "Sem correspondência" .

Em seu shell moderno derivado de Bourne (Unix versão 7) , ls -l *.c geraria o erro "*. c: Nenhum tal arquivo ou diretório ". Eu diria que esta mensagem é mais fácil de entender; também indica o padrão que falhou.

Observe se *.c foi expandido para vazio, ls -l *.c mostrará todos os arquivos no diretório e não imprimirá nenhum erro.

bash tem uma opção failglob para comportamento mais próximo do original.

    
por 01.11.2016 / 20:44

Tags