
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 *.c
generarí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 *.c
se expandió hasta dejarlo vacío, ls -l *.c
se mostrarán todos los archivos en el directorio y no se imprimirá ningún error.
bash tiene una failglob
opció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 nullglob
una opción.