Para pasar un nombre de archivo con espacios a un script de shell en macOS, entrecomilla la ruta como un único argumento al ejecutar el script y, a continuación, utiliza "$1" dentro del script. Por ejemplo, ./process-file.sh "/Users/sam/Documents/Quarterly Report.pdf" pasa un único nombre de archivo; sin comillas, el shell lo divide en varios argumentos. Este método también funciona con rutas que contienen otros caracteres sensibles para el shell si se entrecomillan correctamente.
Ejecutar el script con la ruta como un único argumento
En Terminal, escribe comillas dobles alrededor del nombre de archivo o ruta completos, incluidos sus directorios, y mantén el nombre del script separado:
./process-file.sh "/Users/sam/Documents/Quarterly Report.pdf"
Una barra invertida antes de cada espacio también funciona para una ruta simple escrita a mano: ./process-file.sh /Users/sam/Documents/Quarterly\ Report.pdf. Entrecomillar la ruta completa es más fácil de leer y menos propenso a errores, especialmente cuando contiene varios espacios. Las comillas son sintaxis de shell; agrupan la ruta en un solo argumento y no forman parte del nombre de archivo que recibe el script. El shell realiza la división de palabras (word splitting) tras las expansiones, por lo que una ruta sin comillas puede dividirse en los espacios. Bash Reference Manual: Quoting
Si el archivo está en el directorio actual, una ruta relativa también funciona:
./process-file.sh "Quarterly Report.pdf"
La ruta debe seguir apuntando a un archivo existente desde el directorio donde ejecutes el comando. Si el script en sí no es ejecutable, invócalo con un shell en su lugar, por ejemplo bash process-file.sh "/Users/sam/Documents/Quarterly Report.pdf". Cualquiera de las dos formas pasa la ruta como argumento; el script necesita permiso de lectura para el archivo y debe gestionar cualquier otro permiso requerido.
Utilizar el argumento de forma segura dentro del script
Guarda esto como process-file.sh:
#!/bin/bash
if [ "$#" -ne 1 ]; then
printf 'Usage: %s FILE\n' "$0" >&2
exit 2
fi
file=$1
if [ ! -f "$file" ]; then
printf 'Not a regular file: %s\n' "$file" >&2
exit 1
fi
printf 'Received one file: %s\n' "$file"
El script comprueba que ha recibido exactamente un argumento, verifica que la ruta corresponde a un archivo regular e imprime la ruta recibida. $# es el número de argumentos; $1 es el primero. Mantén entrecomilladas las expansiones de variables ("$file") al pasar una ruta a un comando o al utilizarla en una comprobación. De lo contrario, el shell podría dividir un valor que contenga espacios en palabras independientes y tratar los caracteres comodín como patrones de nombres de archivo. El manual de Bash documenta los parámetros posicionales y los pasos de división de palabras y expansión de nombres de archivo del shell. Bash Reference Manual: Positional Parameters and Shell Expansions
Para procesar varios nombres de archivo, entrecomilla cada ruta al invocar el script y itera sobre "$@" para que cada argumento se mantenga diferenciado:
for file in "$@"; do
printf 'Received: %s\n' "$file"
done
No utilices $* ni $@ sin comillas para este propósito: pueden combinar o dividir los valores de los argumentos. Si el script espera exactamente un archivo, mantén la comprobación de un solo argumento y pasa una única ruta entrecomillada.
Cuando AppleScript ejecuta el comando de shell
Un comando do shell script de AppleScript toma una cadena de texto que contiene código de shell. Si concatenas una ruta directamente en ese comando, una ruta como /Users/sam/Quarterly Reports/report.pdf se interpretará como múltiples palabras de shell. Apple documenta quoted form como la forma de generar texto seguro para la interpretación del shell, incluidas las cadenas con espacios y caracteres de comillas incrustados. Apple: Calling Command-Line Tools
Para una ruta conocida, entrecomíllala con quoted form of antes de concatenarla:
set filePath to "/Users/sam/Quarterly Reports/report.pdf"
set safePath to quoted form of filePath
do shell script "/path/to/process-file.sh " & safePath
El comando resultante proporciona al script un único argumento de ruta. Si la ruta proviene de un selector de archivos, convierte primero el elemento elegido a una ruta POSIX y luego entrecomíllala:
set filePath to POSIX path of (choose file)
do shell script "/path/to/process-file.sh " & quoted form of filePath
La referencia de AppleScript de Apple demuestra este patrón para una carpeta seleccionada y señala que quoted form también gestiona comillas simples incrustadas. AppleScript Language Guide: Commands Reference
Solucionar errores comunes
Si el script informa de que ha recibido varios argumentos, comprueba el comando que lo inicia: la ruta completa debe estar dentro de un único par de comillas. Si recibe una ruta con comillas literales, comprueba si esas comillas se incluyeron en la propia cadena del nombre de archivo; las comillas del shell deben agrupar el argumento, no convertirse en parte de su valor.
Si el script recibe la ruta correctamente pero un comando posterior falla, comprueba también los argumentos de ese comando. Entrecomillar el comando de ejecución no protege automáticamente una variable sin comillas dentro del script: utiliza formatos como some-command "$file". En el caso de AppleScript, no agregues comillas alrededor de una ruta a mano; concatena quoted form of la ruta al comando de shell. Esto solo resuelve el análisis sintáctico del shell. No hace que una ruta no válida pase a existir, no concede acceso al archivo ni garantiza que el programa invocado acepte el archivo.
Fuentes
Bash Reference Manual: Quoting — GNU Project
Bash Reference Manual — GNU Project
Mac Automation Scripting Guide: Calling Command-Line Tools — Apple
Commands Reference — Apple