Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#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... mad

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 ! wink

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

Watael a écrit :

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 big_smile
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à smile
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