En una Mac, coloque un patrón comodín entre comillas simples para evitar que el shell predeterminado zsh lo expanda antes de que se ejecute el comando. Por ejemplo, printf '%s\n' '*.csv' pasa el texto literal *.csv como un solo argumento. El shell elimina las comillas; el asterisco llega al programa. Si el programa utiliza patrones por sí mismo, es posible que interprete ese asterisco posteriormente.

Por qué cambia el comodín antes de que se ejecute el comando

Cuando introduce un comando en Terminal, el shell procesa sus argumentos antes de iniciar el programa. En zsh, un * sin entrecomillar puede activar la generación de nombres de archivo: el shell sustituye el patrón por los nombres de archivo coincidentes. Si no hay coincidencias, zsh suele informar de un error, aunque las opciones del shell pueden modificar ese comportamiento. El manual de zsh describe la generación de nombres de archivo y su comportamiento cuando no hay coincidencias.

Apple designa a zsh como el shell predeterminado en Terminal, aunque se puede configurar una Mac para que utilice otro shell. La guía de Terminal de Apple explica cuál es el shell predeterminado y cómo cambiarlo. El método de comillas simples que se describe a continuación es adecuado para zsh y Bash; si utiliza un shell diferente, consulte su manual, ya que las reglas de entrecomillado pueden variar.

Utilice comillas simples para un comodín literal

Escriba el patrón comodín entre comillas simples, conservando cualquier otro carácter que forme parte de él. Por ejemplo:

printf '%s\n' '*.csv'

El resultado es el *.csv literal, independientemente de si el directorio actual contiene o no archivos CSV. printf recibe el patrón como un argumento y lo imprime; el shell no expande el asterisco. Las comillas forman parte de la sintaxis del shell, por lo que no se incluyen en el argumento. La guía de scripting de shell de Apple explica que las comillas simples deshabilitan la expansión del shell dentro del texto entrecomillado. Apple: Flow Control, Expansion, and Parsing.

Esto es especialmente importante cuando se espera que el propio programa procese un patrón. En macOS, por ejemplo, find puede hacer coincidir nombres de archivo utilizando el patrón suministrado a -name:

find . -type f -name '*.log'

En este caso, el shell pasa *.log literalmente a find; luego, find aplica su propia coincidencia de nombres a los archivos que se encuentran bajo el directorio actual. El entrecomillado evita que el shell reemplace el patrón con nombres del directorio actual antes de que find pueda usarlo. El significado del patrón depende del programa receptor: el entrecomillado en el shell controla la expansión del shell, no cómo el programa interpreta su argumento.

Cuándo usar una barra invertida en su lugar

Para un patrón corto, una barra invertida puede proteger un comodín individual fuera de las comillas:

printf '%s\n' \*.csv

Esto también pasa el asterisco literalmente. Las comillas simples suelen ser más fáciles de leer cuando un patrón contiene varios caracteres especiales, espacios o corchetes. Por ejemplo, 'chapter [0-9]*.txt' evita que el shell interprete los corchetes y el comodín. Apple documenta el entrecomillado con barra invertida y el comportamiento de las comillas simples en su guía de scripting de shell.

Errores de entrecomillado comunes

Las comillas dobles no protegen de forma fiable todos los caracteres del shell. Evitan la expansión de comodines en zsh, pero siguen permitiendo ciertas expansiones, incluidas variables como $name y sustituciones de comandos como $(command). Para un patrón que deba llegar exactamente como se escribió, use comillas simples a menos que el argumento necesite una de esas expansiones.

Una comilla simple no puede aparecer dentro de una cadena entre comillas simples como un carácter ordinario. Si el propio patrón contiene un apóstrofo, cierre la parte entrecomillada, agregue el apóstrofo utilizando otro método de entrecomillado y vuelva a abrir las comillas simples; Apple muestra esta técnica de entrecomillado de shell en su guía. En el caso de patrones poco habituales, revise con atención el comando exacto antes de ejecutarlo.

Distinga también la expansión del shell del comportamiento del programa receptor. Entrecomillar *.log no obliga a un programa a tratar el asterisco como un carácter ordinario; solo garantiza que el shell lo transmita tal cual. Una utilidad como find -name puede interpretarlo como un patrón, mientras que otro comando podría tratarlo de forma literal. Consulte la documentación del propio comando cuando la distinción sea relevante.

Una comprobación rápida antes de presionar Retorno

Pregúntese qué debe recibir el programa. Si necesita un patrón comodín, coloque el patrón entre comillas simples y confirme que las opciones del comando estén configuradas para interpretar patrones según lo previsto. Si el programa debe recibir un nombre de archivo real, deje habilitada la expansión del shell donde sea apropiado, o proporcione el nombre de archivo directamente. La clave es entrecomillar en el límite del shell cuando desee que el programa reciba los caracteres comodín en sí mismos.

Fuentes