Pour passer un nom de fichier contenant des espaces à un script shell sur macOS, mettez le chemin entre guillemets comme un seul argument lorsque vous exécutez le script, puis utilisez "$1" à l'intérieur du script. Par exemple, ./process-file.sh "/Users/sam/Documents/Quarterly Report.pdf" transmet un seul nom de fichier ; sans guillemets, le shell le découpe en plusieurs arguments. Cette méthode fonctionne également avec les chemins contenant d'autres caractères sensibles pour le shell lorsqu'ils sont correctement placés entre guillemets.
Exécuter le script avec le chemin comme un seul argument
Dans Terminal, entourez de guillemets doubles le nom de fichier ou le chemin complet, y compris ses répertoires, et séparez bien le nom du script :
./process-file.sh "/Users/sam/Documents/Quarterly Report.pdf"
Une barre oblique inverse (backslash) avant chaque espace fonctionne également pour un chemin simple saisi au clavier : ./process-file.sh /Users/sam/Documents/Quarterly\ Report.pdf. Mettre l'ensemble du chemin entre guillemets est plus facile à lire et moins source d'erreurs, surtout lorsqu'il contient plusieurs espaces. Les guillemets relèvent de la syntaxe du shell ; ils regroupent le chemin en un seul argument et ne font pas partie du nom de fichier reçu par le script. Le shell effectue un découpage en mots après les expansions, de sorte qu'un chemin sans guillemets peut être scindé au niveau des espaces. Bash Reference Manual: Quoting
Si le fichier se trouve dans le répertoire courant, un chemin relatif fonctionne également :
./process-file.sh "Quarterly Report.pdf"
Le chemin doit toujours pointer vers un fichier existant depuis le répertoire dans lequel vous lancez la commande. Si le script lui-même n'est pas exécutable, lancez-le plutôt avec un shell, par exemple bash process-file.sh "/Users/sam/Documents/Quarterly Report.pdf". L'une ou l'autre forme transmet le chemin comme un argument ; le script a besoin des autorisations de lecture sur le fichier et doit gérer toute autre permission requise.
Utiliser l'argument en toute sécurité à l'intérieur du script
Enregistrez ceci sous le nom 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"
Le script vérifie qu'il a reçu exactement un argument, s'assure que le chemin désigne un fichier ordinaire, puis affiche le chemin reçu. $# représente le nombre d'arguments ; $1 est le premier. Conservez les expansions de variables entre guillemets — "$file" — lors de la transmission d'un chemin à une commande ou de son utilisation dans un test. Sinon, le shell risque de découper une valeur contenant des espaces en mots distincts et de traiter les caractères génériques comme des motifs de noms de fichiers. Le manuel de Bash documente les paramètres positionnels ainsi que les étapes de découpage de mots et d'expansion de noms de fichiers du shell. Bash Reference Manual: Positional Parameters and Shell Expansions
Pour traiter plusieurs noms de fichiers, mettez chaque chemin entre guillemets lors de l'appel du script, et parcourez "$@" dans une boucle afin que chaque argument reste distinct :
for file in "$@"; do
printf 'Received: %s\n' "$file"
done
N'utilisez pas $* ou un $@ sans guillemets dans ce but : ceux-ci peuvent combiner ou scinder les valeurs des arguments. Si le script attend exactement un seul fichier, conservez la vérification d'argument unique et passez un seul chemin entre guillemets.
Lorsque AppleScript lance la commande shell
Une commande AppleScript do shell script prend une chaîne de texte contenant du code shell. Si vous concaténez directement un chemin dans cette commande, un chemin tel que /Users/sam/Quarterly Reports/report.pdf sera interprété comme plusieurs mots par le shell. Apple documente quoted form comme la méthode permettant de produire un texte interprétable en toute sécurité par le shell, y compris pour les chaînes contenant des espaces et des guillemets intégrés. Apple: Calling Command-Line Tools
Pour un chemin connu, placez-le entre guillemets avec quoted form of avant de le concaténer :
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
La commande résultante fournit au script un seul argument de chemin. Si le chemin provient d'une boîte de dialogue de sélection de fichier, convertissez d'abord l'élément choisi en chemin POSIX, puis appliquez-lui quoted form :
set filePath to POSIX path of (choose file)
do shell script "/path/to/process-file.sh " & quoted form of filePath
La référence AppleScript d'Apple illustre ce modèle pour un dossier sélectionné et note que quoted form gère également les apostrophes ou guillemets simples intégrés. AppleScript Language Guide: Commands Reference
Résoudre les erreurs courantes
Si le script indique qu'il a reçu plusieurs arguments, vérifiez la commande qui le lance : le chemin complet doit se trouver entre une seule paire de guillemets. S'il reçoit un chemin comportant des guillemets littéraux, vérifiez si ces derniers faisaient partie intégrante de la chaîne du nom de fichier ; les guillemets du shell doivent regrouper l'argument, pas devenir une composante de sa valeur.
Si le script reçoit correctement le chemin mais qu'une commande ultérieure échoue, examinez également les arguments de cette commande. Mettre des guillemets dans la commande de lancement ne protège pas automatiquement une variable laissée sans guillemets à l'intérieur du script : utilisez des formes telles que some-command "$file". Pour AppleScript, n'ajoutez pas de guillemets à la main autour d'un chemin ; concaténez le quoted form of du chemin à la commande shell. Cela concerne uniquement l'analyse syntaxique du shell. Cela ne permet pas de faire exister un chemin invalide, d'accorder des accès aux fichiers ou de garantir que le programme appelé acceptera le fichier.
Sources
Bash Reference Manual: Quoting — GNU Project
Bash Reference Manual — GNU Project
Mac Automation Scripting Guide: Calling Command-Line Tools — Apple
Commands Reference — Apple