Contenu | Rechercher | Menus

Annonce

DVD, clés USB et t-shirts Ubuntu-fr disponibles sur la boutique En Vente Libre

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 15/07/2021, à 21:24

manup31

Substitution des espaces dans une variable

Bonjour,

Je souhaite, dans un bash, pouvoir lancer nautilus pour qu'il s'ouvre sur un dossier nommé.
Dans le nom du dossier il y a (au moins) un espace.
Le nom du dossier est calculé, et la variable dir le désigne.

Par exemple, on peut avoir dir valant "/home/user/dossier test".

Dans le script, la commande nautilus "$dir" ne fonctionne pas, provoque une erreur (Oups ! Quelque chose s'est mal passé, etc.)

Je pense à remplacer le(s) espace(s) dans dir par "\ ", et j'ai trouvé la syntaxe ${dir// /\\ }. Encore plus court qu'un echo $dir | sed 's/ /\\ /g'

echo ${dir// /\\ } affiche bien /home/user/dossier\ test

Mais ls "${dir// /\\ }" répond :
ls: impossible d'accéder à '/home/user/dossier\ test': Aucun fichier ou dossier de ce type
alors que ls /home/user/dossier\ test ne renvoie pas d'erreur...

Et bien sûr, nautilus "${dir// /\\ }" s'excuse d'un Oups ! Quelque chose s'est mal passé.

Comment s'en sortir ?


manu'

Hors ligne

#2 Le 15/07/2021, à 21:27

jplemoine

Re : Substitution des espaces dans une variable

A tester mais normalement, il suffit d'entourer la variable avec des ".
ls "nom avec espaces" devrait fonctionner.
Donc

dummy=$(ls \"$dir\")

--> devrait fonctionner


Membre de l'ALDIL (Association Lyonnaise pour le Développement de l'Informatique Libre)
- En pro, après 20 ans de développement, administrateur Linux / Unix depuis Avril 2019.
- En privé, sous Ubuntu-Xubuntu depuis 2009.

Hors ligne

#3 Le 15/07/2021, à 21:34

manup31

Re : Substitution des espaces dans une variable

Merci @jplemoine pour l'intérêt porté à ma question.

Voilà l'output (manu a remplacé user par rapport à l'exemple précédent)

$ echo $dir
/home/manu/dossier test
$ dummy=$(ls \"$dir\")
ls: impossible d'accéder à '"/home/manu/dossier': Aucun fichier ou dossier de ce type
ls: impossible d'accéder à 'test"': Aucun fichier ou dossier de ce type
$ file /home/manu/dossier\ test
/home/manu/dossier test: directory

manu'

Hors ligne

#4 Le 15/07/2021, à 22:46

kamaris

Re : Substitution des espaces dans une variable

Du point de vue shell, la commande nautilus "$dir" est correcte et gère correctement les espaces, donc le problème vient d'ailleurs.
Il faudrait voir plus précisément ce que dit Nautilus dans son message d'erreur.

Hors ligne

#5 Le 15/07/2021, à 23:35

MicP

Re : Substitution des espaces dans une variable

Bonjour

Si le chemin absolu "/home/manu/dossier test" existe
il est fort possible que le chemin relatif \"/home/manu/dossier test\" n'existe pas
car en échappant les caractères apostrophe, ils finissent par faire partie du nom de fichier :

Pour le constater, essaye et compare les sorties de :

ls "/home/manu/dossier test"

et

ls \"/home/manu/dossier test\"

=======
Donc, change la ligne :

dummy=$(ls \"$dir\")

par :

dummy=$(ls "$dir")

=======
mais de toutes façons, utiliser le retour de la commande ls dans un script n'est pas une chose à faire,
il vaudrait mieux utiliser un tableau :

dummy=( "$dir"/* )

et adapter la suite du script en tenant compte du fait que la variable dummy sera maintenant
un tableau de chaînes de caractères dont chaque élément du tableau sera un des noms de fichier ou répertoire qui existe dans le répertoire /home/manu/dossier test
et ne sera donc plus une seule chaîne de caractères (dont il pourrait être difficile d'extraire les noms de chaque fichier ou répertoire)

Dernière modification par MicP (Le 16/07/2021, à 02:23)


Retour utilisable de commande
2.d  Le prompt final : - permet de s'assurer que la commande est allée à son terme,- permet de s'assurer que la réponse du système n'est pas coupée à la fin,- et fournit parfois d'autres informations, détaillées au message #42

Hors ligne