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/11/2019, à 12:20

Plug

[Résolu] [Bash] espace dans un nom de fichier affecté à une variable

Bonjour,

J'ai une partie de script toute simple (du moins je le croyais hmm ) qui liste les fichiers d'un répertoire

#!/bin/bash
# lister les fichiers

Dir=/home/papa/
Fichiers_papa=$(ls $Dir)

for i in $Fichiers_papa
do
   echo $i
done
exit 0

Mais voilà; quand le répertoire contient un fichier dont le nom contient un espace, ça ne marche pas.

papa@pc-linuxshop:~/prg$ Dir=/home/papa/
papa@pc-linuxshop:~/prg$ ls $Dir
fichier_sans_espace    'fichier avec'
papa@pc-linuxshop:~/prg$ Fichiers_papa=$(ls $Dir)
papa@pc-linuxshop:~/prg$ echo $Fichiers_papa
fichier_sans_espace    fichier   avec

Quand on tape la commande directement en console, le nom du fichier est bien affiché entre quotes.
Mais quand on met le résultat de la commande ls dans une variable, les quotes disparaissent.

Comment peut-on les conserver, ou récupérer le nom du fichier en un seul morceau ?

Désolé pour si peu, je me doute que ce doit être assez simple, mais je ne sais même pas comment formuler ma recherche dans google sad

Merci

Dernière modification par Plug (Le 10/11/2019, à 16:13)

Hors ligne

#2 Le 10/11/2019, à 12:27

Watael

Re : [Résolu] [Bash] espace dans un nom de fichier affecté à une variable

et voilà ce qui arrive quand on essaie de parcourir la sortie de ls !

for f in "$Dir"/*; do : ce que tu veux avec "$f"; done

c'est tout.

ls sert pour lister, pas pour scripter !


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#3 Le 10/11/2019, à 13:21

Plug

Re : [Résolu] [Bash] espace dans un nom de fichier affecté à une variable

Merci Watael, je vais tester ça.

Donc si je comprends bien "ls, c'est mal" aussi ? lol

Pourtant ça me semblait être juste une commande dont on traite la sortie.
Alors pourquoi cette sortie là, plus que les autres, ne devrait-elle pas être parcourue ? (juste par curiosité)

Hors ligne

#4 Le 10/11/2019, à 13:27

Sciensous

Re : [Résolu] [Bash] espace dans un nom de fichier affecté à une variable

attention quand même: n'affiche pas les fichiers cachés (précédés d'un .)


antiX 19 et 21 et Ubuntu 20.04 et 22.04
( sous LXDE et gnome-shell )

Hors ligne

#5 Le 10/11/2019, à 13:41

Watael

Re : [Résolu] [Bash] espace dans un nom de fichier affecté à une variable

parce qu'on est plus susceptible de parcourir cette sortie avec une boucle for.
d'une manière générale, on ne parcourt pas la sortie d'une commande quelconque avec une boucle for parce que celle-ci découpe les lignes en mots, comme tu viens d'en faire l'expérience.

et puis pourquoi utiliser une commande externe quand le shell peut le faire ?

quant aux fichiers cachés, si nécessaires, on peut arranger ça avec shopt.


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#6 Le 10/11/2019, à 15:15

Plug

Re : [Résolu] [Bash] espace dans un nom de fichier affecté à une variable

Sciensous a écrit :

attention quand même: n'affiche pas les fichiers cachés (précédés d'un .)

Ça tombe je ne les veux pas cool

Watael a écrit :

d'une manière générale, on ne parcourt pas la sortie d'une commande quelconque avec une boucle for parce que celle-ci découpe les lignes en mots

D'accord, je retiens le principe. Néanmoins, la sortie de ls prend soin de mettre des quotes autour du nom contenant un espace.
Pourquoi l'affectation du résultat à une variable, fait disparaitre ces quotes ?

(Je sais je suis très curieux wink )

Sinon ta solution règle en effet le problème des noms avec espace mais inclut le chemin dans le résultat alors que je ne voudrais que le nom du fichier. Je vais essayer de retraiter le résultat mais du coup j'ai peur de retomber dans le même problème parce que je vais devoir réaffecter à une variable pour découper (ne garder que le nom sans le path).

Dernière modification par Plug (Le 10/11/2019, à 15:51)

Hors ligne

#7 Le 10/11/2019, à 15:35

Watael

Re : [Résolu] [Bash] espace dans un nom de fichier affecté à une variable

parce que le shell n'interprète pas les "quotes" des autres programmes.
et comme je l'ai dit, for lit des mots, et ne tient pas plus compte des apostrophes/quotes, qui d'ailleurs ne disparaissent pas, mais font partie de la chaîne lue comme n'importe quel autre caractère.

$ var="m\a 'belle phrase' avec des mots"
$ for i in $var; do echo ">$i<"; done
>m\a<
>'belle<
>phrase'<
>avec<
>des<
>mots<

Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#8 Le 10/11/2019, à 15:37

melixgaro

Re : [Résolu] [Bash] espace dans un nom de fichier affecté à une variable

Plug a écrit :

D'accord, je retiens le principe. Néanmoins, la sortie de ls prend soin de mettre des quotes autour du nom contenant un espace.
Pourquoi l'affectation du résultat à une variable, fait disparaitre ces quotes ?

(Je sais je suis très curie

Bonjour,
Les apostrophes droites n'apparaissent que lorsque la sortie de ls se fait vers un terminal. Quand tu utilises un pipe ou une redirection vers un fichier, la commande ls le détecte et enlève les apostrophes droites (ou plutôt ne met pas d'apostrophes autour des noms de fichiers avec un espace ou un caractère particulier).

Dernière modification par melixgaro (Le 10/11/2019, à 15:38)


Linux depuis ~2007. Xubuntu seulement.

Hors ligne

#9 Le 10/11/2019, à 16:10

Plug

Re : [Résolu] [Bash] espace dans un nom de fichier affecté à une variable

Merci Watel et melixgaro pour ces éclaircissements.

Hors ligne