Bash: ¿Por qué no * devuelve una cadena vacía en caso de que no coincida

Bash: ¿Por qué no * devuelve una cadena vacía en caso de que no coincida

No entiendo por qué * regresa solo cuando no hay coincidencia. Esterespuestaafirma que este es el caso, pero no entiendo el motivo de este comportamiento. ¿Por qué *, o cualquier patrón genérico, no devuelve simplemente una cadena vacía en caso de que no coincida?

$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
$

Respuesta1

Los patrones que no coinciden con ningún archivo se consideran un error. Puedes ver esto en las primeras versiones de Unix.

globoimprimiría un error y el comando que se pasó nunca se ejecutaría.

El mensaje de error fue"Sin coincidencia".

En su caparazón moderno derivado deBourne (Unix versión 7), ls -l *.cgeneraría el error "*.c: No existe tal archivo o directorio". Yo diría que este mensaje es más fácil de entender; También indica el patrón que falló.

Tenga en cuenta que si *.cse expandió hasta dejarlo vacío, ls -l *.cse mostrarán todos los archivos en el directorio y no se imprimirá ningún error.

bash tiene una failglobopción para un comportamiento más cercano al original.

Respuesta2

El * en realidad está siendo expandido por bash (cualquiera que sea su shell) y luego se pasa aleco. ElecoEl comando no hace más que imprimirlo en la salida estándar. Lea este documento -Ampliación del nombre del archivo. Dice-

Bash escanea cada palabra en busca de los caracteres "*", "?" y "[". Si aparece uno de estos caracteres, entonces la palabra se considera un PATRÓN y se reemplaza con una lista ordenada alfabéticamente de nombres de archivos que coinciden con el patrón. Si no se encuentran nombres de archivos coincidentes y la opción de shell nullglob está deshabilitada, la palabra no se modifica. Si se establece la opción nullglob y no se encuentran coincidencias, la palabra se elimina.

Entonces, en realidad, cuando bash no puede encontrar ninguna coincidencia, deja '*' sin cambios y echo lo imprime.

Razón La razón por la que bash no devuelve una declaración vacía de forma predeterminada es que puede haber casos en los que el usuario no quiera usar el '*' como comodín y, por lo tanto, no necesita la expansión de '*'. Y, por lo tanto, en este caso expandir el '*' a una cadena vacía sería erróneo. Sin embargo, este comportamiento predeterminado se puede anular mediante nullglobuna opción.

información relacionada