#1 Le 10/12/2024, à 22:11
- Duanra
[Résolu] Problème chemin avec espaces dans cd
*** NOTE : je sais qu'il existe plein de posts sur le forum pour le même problème, mais chez moi ça ne marche pas... ***
Bonjour à tous,
Je suis bloqué par un problème qui semble tout bête à régler, mais je n'arrive pas à m'en dépatouiller. J'ai un script basique, mon_script.sh :
#!/bin/bash
read "Donnez le nom du répertoire à créer : " nom
path="/home/utilisateur/Documents/chemin\ avec\ espaces"
cd "$path"
mkdir "$nom" &&
cd ./"$nom" &&
touch notes_"$nom"
Quand je lance mon_script.sh, j'ai un message d'erreur :
mon_script.sh: line 6: cd: /home/utilisateur/Documents/chemin\ avec\ espaces: No such file or directory
Bien entendu, le répertoire existe.
J'ai essayé :
- "/home/utilisateur/Documents/chemin avec espaces"
- "/home/utilisateur/Documents/chemin\ avec\ espaces"
- /home/utilisateur/Documents/chemin\ avec\ espaces
- (/home/utilisateur/Documents/chemin avec espaces)
- (/home/utilisateur/Documents/chemin\ avec\ espaces)
Rien n'y fait (L'idée des parenthèses vient de shellcheck.net).
Mon shell est zsh. Je ne pense pas que ça soit important ici, mais j'ai essayé avec "#!/bin/bash" et "#!/bin/zsh", ça ne veut pas marcher.
Si quelqu'un peut m'apporter un peu de lumière, parce que ça devient rageant de lire qu'il suffit de mettre des guillemets...
Dernière modification par Duanra (Le 11/12/2024, à 22:32)
Hors ligne
#2 Le 10/12/2024, à 22:13
- iznobe
Re : [Résolu] Problème chemin avec espaces dans cd
Bonsoir , essaie :
'/home/utilisateur/Documents/chemin avec espaces'
des guillemets ( simples ) : ' ( touche 4 ) , c' est pas des doubles quotes : " ( touche 3 ) ...
Dernière modification par iznobe (Le 10/12/2024, à 22:15)
retour COMPLET et utilisable de commande
MSI Z490A-pro , i7 10700 , 32 GB RAM .
Hors ligne
#3 Le 10/12/2024, à 22:24
- Watael
Re : [Résolu] Problème chemin avec espaces dans cd
simple ou doubles qoutes, le vrai problème, c'est les barres obliques inverses, qui ne servent, justement, que lorsqu'il n'y a pas de quotes !
je suppose que l'absence d'indicateur de prompt (-p) à la commande read est une coquille de recopie sur le forum...
Dernière modification par Watael (Le 10/12/2024, à 22:27)
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#4 Le 11/12/2024, à 01:19
- sputnick
Re : [Résolu] Problème chemin avec espaces dans cd
Si malgré toutes les tentatives cela génère une erreur, alors tu a créé le script depuis windows.
C'est un souci avec les fins de lignes différentes win/linux: CRLF.
Pour régler le problème:
Utiliser le chemin avec des guillemets dans le script, puis:
dos2unix mon_script.sh
bash mon_script.sh
Qui veut faire quelque chose trouve un moyen, qui ne veut rien faire trouve une excuse. Proverbe arabe
https://sputnick.fr
Hors ligne
#5 Le 11/12/2024, à 05:15
- jplemoine
Re : [Résolu] Problème chemin avec espaces dans cd
Après de multiples essais, une syntaxe qui fonctionne :
path="/home/utilisateur/Documents/chemin" & #20 & "avec" & #20 & "espaces"
explication : 20 est le code ASCII de l'espace en hexa. On demande donc de concaténer les sous-phrases avec le "caratère dont code ascii est 20 (hexa)"
Ce compte ne servira plus : vous pouvez le supprimer si le coeur vous en dit...
Laissé par l'auteur pour historique.
Hors ligne
#6 Le 11/12/2024, à 05:35
- Watael
Re : [Résolu] Problème chemin avec espaces dans cd
8O
t'es sûr pour les esperluettes ?
une particularité de zsh, peut-être ?
parce qu'en bash, on indique l'hexa ainsi :
$ path="/home/watael/Documents/chemin\x20avec\x20espaces"
mais ça demande d'activer l'interprétation des barres contre-obliques d'échappement
$ echo -e "$path"
/home/watael/Documents/chemin avec espaces
et ce n'est pas gagné pour autant :
$ mkdir Documents/chemin\ avec\ espaces
$ ls "$path"
/usr/bin/ls: impossible d'accéder à '/home/watael/Documents/chemin\x20avec\x20espaces': Aucun fichier ou dossier de ce nom
ce, avec ou sans guillemets autour de $path
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#7 Le 11/12/2024, à 08:23
- jplemoine
Re : [Résolu] Problème chemin avec espaces dans cd
Je ne suis sûr de rien mais j'ai testé en bash et ça fonctionne.
De mémoire, l'esperluette (&) permet de concaténer 2 chaînes de caractères.
Je ne vois pas cette syntaxe dans la doc officielle : Je pense alors fait par similitude avec un langage qui m'est familier (le NCL).
Ce compte ne servira plus : vous pouvez le supprimer si le coeur vous en dit...
Laissé par l'auteur pour historique.
Hors ligne
#8 Le 11/12/2024, à 09:54
- Tawal
Re : [Résolu] Problème chemin avec espaces dans cd
Hello,
Normalement, ces syntaxes d'affectation fonctionnent :
f='/home/utilisateur/Documents/chemin avec espaces'
f="/home/utilisateur/Documents/chemin avec espaces"
f=/home/utilisateur/Documents/chemin\ avec\ espaces
Si aucune ne fonctionne, je suppose qu'il y a des espaces insécables dans le nom du fichier.
Le savoir n'a d’intérêt que si on le transmet.
Useless Use of Cat Award
Filenames and Pathnames in Shell: How to do it Correctly
À chaque problème sa solution, à chaque solution son moyen, si pas de moyen, toujours le problème !
Hors ligne
#9 Le 11/12/2024, à 12:46
- Watael
Re : [Résolu] Problème chemin avec espaces dans cd
l'esperluette fait passer la commande qui la précède en arrière plan. J'ai quand même aussi testé en bash, et c'est ce que ça fait :
$ path="/home/utilisateur/Documents/chemin" & #20 & "avec" & #20 & "espaces"
[1] 41478
[1]+ Fini path="/home/utilisateur/Documents/chemin"
fin de la tâche en arrière plan
$ echo "${path:-"pas de \$path"}"
pas de $path
$
l'un de tes précédents essais a peut-être réussi, et aurait persisté...
autant que je sache, la concaténation de chaînes, en shell, se fait par simple juxtaposition.
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#10 Le 11/12/2024, à 14:21
- RaphaelG
Re : [Résolu] Problème chemin avec espaces dans cd
Si on veut voir si il y a des caractères cachés derrière la ligne "path=....", on peut utiliser od.
od -A x -t cx1 mon_script.sh | less -X
Entre '\' (ox5c) et le 'a' de avec (ox61), il ne doit y avoir qu'un seul caractère ' ' (0x20).
Ma petite implémentation de ce que veut faire Duanra :
essai$ cat mon_script.sh
#!/bin/sh
# Ca marche aussi avec le shebang /bin/bash mais je veux couper court à toutes
# les remarques recommandant un bashisme qui aurait l'avantage d'être plus
# concis que mon code mais que je ne maitriserais pas bien.
read -p "Donnez le nom du répertoire à créer : " nom # -p Watael en #3
path=~/essai/chemin\ avec\ espaces
# par principe, pas de cd dans un shell script
mkdir "$path" # dans ton contexte $path existe déjà, pas dans le mien
mkdir "$path/$nom" && touch "$path/$nom/notes_$nom"
essai$ ./mon_script.sh
Donnez le nom du répertoire à créer : toto
essai$ echo $?
0
essai$ ls -l chemin\ avec\ espaces/toto
total 0
-rw-rw-r-- 1 raph raph 0 Dec 11 13:46 notes_toto
essai$
Si on veut relancer le script, il faut effacer les 2 répertoires qu'il acréé.
rm -rf chemin\ avec\ espaces/
Pour le double esperluette, j'ai eu la flemme de tester mais je pense que les 3 commandes ci après sont équivalentes.
cmde1 && cmde2
cmde1 &&
cmde2
cmde1 \
&& cmde2
Dernière modification par RaphaelG (Le 11/12/2024, à 14:39)
Hors ligne
#11 Le 11/12/2024, à 15:53
- sputnick
Re : [Résolu] Problème chemin avec espaces dans cd
Peux tu donner la sortie de:
grep '^path=' mon_script.sh | od -c
?
Qui veut faire quelque chose trouve un moyen, qui ne veut rien faire trouve une excuse. Proverbe arabe
https://sputnick.fr
Hors ligne
#12 Le 11/12/2024, à 16:37
- jplemoine
Re : [Résolu] Problème chemin avec espaces dans cd
l'un de tes précédents essais a peut-être réussi, et aurait persisté...
Je viens de tester en supprimant le répertoire toto et en demandant titi : ça ne fonctionne pas.
J'en déduis donc que tu as surement raison : un essai précédent aurait plus ou moins réussi et je me suis fourvoyé.
Ce compte ne servira plus : vous pouvez le supprimer si le coeur vous en dit...
Laissé par l'auteur pour historique.
Hors ligne
#13 Le 11/12/2024, à 22:31
- Duanra
Re : [Résolu] Problème chemin avec espaces dans cd
Bonjour à tous,
Merci beaucoup pour vos réponses ! Du coup ça permet d'en apprendre beaucoup, ça vaut le coup de poster ici
ET... le problème est résolu en remplaçant les doubles guillements par des guillemets simples (j'aurais aussi pu changer le nom pour "chemin_avec_espaces" mais il faut savoir être joueur...) ! Donc bravo à iznobe et mille merci aux autres. J'avoue que savoir expliquer pourquoi tels guillements marchent et les autres non me dépasse largement mais l'essentiel est là
En tout cas je ne m'attendais pas à tant de réponses et j'ai appris pas mal de choses (le mot esperluette déjà) et aussi que, selon RaphaelG, "par principe pas de cd dans un shell script".
Pourquoi donc ?
Dernière modification par Duanra (Le 11/12/2024, à 22:39)
Hors ligne
#14 Le 12/12/2024, à 03:28
- Watael
Re : [Résolu] Problème chemin avec espaces dans cd
pourquoi tels guillements marchent et les autres non
tu as probablement modifié autre chose.
ne pas utliser cd est moins un principe qu'une chose inutile, voire qui complique l'écriture d'un script, parce que dans le "déroulement" du script, il faut se souvenir de l'endroit où il "s'est déplacé".
le plus simple est donc d'utiliser des chemins absolus assignés à des variables.
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#15 Le 12/12/2024, à 14:39
- RaphaelG
Re : [Résolu] Problème chemin avec espaces dans cd
Pour l'utilisation de cd dans un shell script, Watael a dit l'essentiel.
J'y rajoute une petite couche.
Effectivement le principe 1er est d'utiliser les chemins absolus lorsqu'on manipule des fichiers dans un shell script.
Supposons que ton script mon_script.sh se trouve sous /home/Duanra/grosprojet et n'utilise que des chemins relatifs.
Pour lancer ce script, tu vas faire :
cd grosprojet
./mon_script.sh
Tes chemins relatifs vont être relatif par rapport à ton "working directory" (celui qu'on consulte avec la commande pwd (Print Working Directory)).
A l'intérieur de ton script, dans le cas que je viens d'ébaucher, le working directory est initialement /home/Duanra/grosprojet et il va changer au fur et à mesure de des cd (Change Directory) que tu feras à l'intérieur du script.
Ton projet est maintenant terminé, il marche super bien, il est vachement utile et tu voudrais pouvoir le lancer de n'importe où. Pour ce faire tu le mets dans le répertoire /home/Duanra/bin qui est dans ta variable d'environnement PATH comme cela tu peux le lancer de n'importe où par exemple depuis ta home directory qui est /home/Duanra.
Seulement c'est la cata. Tes chemins relatifs ne vont plus fonctionner car le working directory est devenu /home/Duanra au lieu de /home/Duanra/grosprojet.
Tu aurais utiliser des chemins absolus, mon_script.sh continuerait à fonctionner.
Après il y a un 2ème principe qui découle du 1er. Avec des chemins absolus, comme le dit Watael, les cd ne servent à rien.
Par exemple dans ton script du #1, tu fais :
cd "$path" #Tiens d'ailleurs, ta variable path est un chemin absolu
mkdir "$nom" #Là par contre ce doit être un chemin relatif en tout cas c'est au bon vouloir de la personne qui saisit le read au dessus.
Autant faire directement :
mkdir $path/$nom #Avec les mêmes contraintes : $path absolu, $nom relatif
Tu gagnes 1 ligne et 3 caractères. C'est énorme !
Hors ligne