IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Shell et commandes GNU Discussion :

Précision sur l'action d'une commande


Sujet :

Shell et commandes GNU

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre actif
    Homme Profil pro
    ...
    Inscrit en
    Septembre 2015
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : ...
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Septembre 2015
    Messages : 33
    Par défaut Précision sur l'action d'une commande
    Bonjour,

    Sur cette commande, enfin cette proto-commande, où on écrase le contenu du dossier "cible" et où "cible" contient à sa racine plusieurs dossiers et 2 fichiers :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ...overwrite /rep00/rep01/cible/\*/\*
    Je n'arrive pas à expliquer précisément l'action de

  2. #2
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 835
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 835
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par Mr ZEE Voir le message
    Je n'arrive pas à expliquer précisément l'action de
    C'est un simple backslash permettant de ne pas transformer le caractère "*". On veut donc le fichier se situant dans le dossier "*" (littéralement "étoile") et dont le nom c'est là aussi littéralement "*".
    Mais si on écrit "*/*" le shell transforme ces caractères pour leur faire signifier "tout dossier dont le nom est tout caractère et contenant tout fichier dont le nom est tout caractère" ce qui équivaut à "tous les fichiers de tous les dossiers" tout court. Donc il faut neutraliser leur action donc backslash.
    On aurait pu écrire aussi ...overwrite "/rep00/rep01/cible/*/*" entre quotes ce qui a la même action et qui permet donc d'éviter le backslash.

    PS: ce sont là des noms peu judicieux. Celui qui a créé ces fichiers était soit un petit plaisantin, soit un type pas super fûté.
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  3. #3
    Membre actif
    Homme Profil pro
    ...
    Inscrit en
    Septembre 2015
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : ...
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Septembre 2015
    Messages : 33
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    PS: ce sont là des noms peu judicieux. Celui qui a créé ces fichiers était soit un petit plaisantin, soit un type pas super fûté.
    Les noms des dossiers sont à titre indicatif et un prétexte pour établir un chemin, rien de plus

    Merci pour ta réponse.
    Donc on est bien d'accord pour constater que cette proto-commande par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ...overwrite /rep00/rep01/cible/*
    Ne peut pas fonctionner, parce qu'elle est incomplète.

    Qu'est ce que cela donne pour cette proto-commande ? :

  4. #4
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 835
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 835
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Mr ZEE Voir le message
    Donc on est bien d'accord pour constater que cette proto-commande par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ...overwrite /rep00/rep01/cible/*
    Ne peut pas fonctionner, parce qu'elle est incomplète.
    Je ne comprends pas ce que tu entends par "incomplète". En quoi est-elle incomplète ? Le nom "étoile" sera remplacé par "tous les fichiers présents dans /rep00/rep01/cible" donc de là on aura bien des noms de fichiers. Si maintenant la commande attend un nom et qu'elle reçoit des noms effectivement elle ne sera pas dans un schéma prévu et refusera l'action (exemple cp /etc/* toto avec "toto" qui n'est pas dossier). Mais d'un point de vue purement shell, elle est parfaitement complète.
    En fait il faut bien comprendre que la commande, elle, ne reçoit pas l'étoile. C'est le shell qui fait l'intermédiaire qui s'occupe de transformer l'étoile en "tous les fichiers présents". Si tu écris un code C et que tu affiches argv[1] puis tu lui envoies "/etc/*" le programme affichera "/etc/adduser.conf"

    Citation Envoyé par Mr ZEE Voir le message
    Qu'est ce que cela donne pour cette proto-commande ? :
    Pourquoi tu n'essayes pas toi-même pour te faire ta propre expérience ?
    • echo /etc/\*
    • echo "/etc/*"
    • echo '/etc/*'
    • echo /etc/*


    Le caractère "quotte simple" (ou apostrophe) a dans ce cas précis le même comportement => il annule l'interprétation. Son comportement sera différent de la quotte double lorsqu'il s'agira de variables (la quotte simple annule tout donc y compris le dollar de la variable, la quotte double annule tout sauf certains éléments dont fait partie le dollar => afficher '$HOME' sera différent d'afficher "$HOME").
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  5. #5
    Membre actif
    Homme Profil pro
    ...
    Inscrit en
    Septembre 2015
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : ...
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Septembre 2015
    Messages : 33
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    Je ne comprends pas ce que tu entends par "incomplète". En quoi est-elle incomplète ?
    Franchement je m'attendais à pire : je te dois une explication

    J'aimerai tester une distro en rolling release et je me suis mis à explorer Manjaro. Et j'ai chopé un post sur leur forum français qui évoque un problème de mise à jour (pas inintéressant pour du rolling release...).
    La maj ne s’exécute pas à cause du contenu du dossier des paramètres régionaux et en réponse on propose dans un premier temps ceci (où -Syu est la commande de maj standard d'après ce que j'ai lu) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sudo pacman -Syu --overwrite /usr/lib/locale/*
    J'ai trouvé ça un peu hard, mais bon... Et ça n'a pas fonctionné.
    En réponse :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sudo pacman -Syu --overwrite '*'
    Qui n'a pas été utilisé et que j'ai trouvé bizarre, mais bon je n'ai pas le niveau non plus...
    Puis il y a eu ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sudo pacman -Syu glibc-locales --overwrite /usr/lib/locale/\*/\*
    Qui a résolu le problème et qui du même coup m'a interpellé sur la fin de la commande des \*/\*, sans compter que le topic à l'air un peu lunaire.

    Ceci dit je te remercie grandement pour tes explications toujours aussi riches et passionnantes

  6. #6
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 835
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 835
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Mr ZEE Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sudo pacman -Syu --overwrite /usr/lib/locale/*
    J'ai trouvé ça un peu hard, mais bon... Et ça n'a pas fonctionné.
    En réponse :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sudo pacman -Syu --overwrite '*'
    Qui n'a pas été utilisé et que j'ai trouvé bizarre, mais bon je n'ai pas le niveau non plus...
    Puis il y a eu ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sudo pacman -Syu glibc-locales --overwrite /usr/lib/locale/\*/\*
    Alors...

    La première ...--overwrite /usr/lib/locale/* va s'adresser à tout le contenu du dossier "/usr/lib/locale" (tous les fichiers et dossiers (je fais la distinction mais en réalité un dossier n'est qu'un fichier particulier) situés juste sous le dossier "/usr/lib/locale"). Effectivement ça semble hard mais sait-on jamais, peut-être qu'effectivement il faut appliquer l'action à tout le contenu de ce dossier.

    La seconde ...--overwrite '*' (on ne parle plus de "/usr/locale" ???) fait là référence à la chaine littérale "étoile". Mais peut-être que c'est voulu, pour que la commande puisse utiliser cette étoile en interne dans son action. Il y a un exemple analogue avec la commande "find". Si tu cherches tous les fichiers commençant par "a", il te faut écrire find ... -name "a*" avec des quottes explicites pour que la commande récupère cette étoile et puisse s'en servir, elle, dans son action interne. C'est elle qui s'occupera de la mettre en regex pour ensuite comparer les fichiers trouvés avec le nom demandé "a*". Si tu ne protèges pas cette étoile par un outil de protection (quottes simples, doubles, backslash) alors le shell l'interceptera et la commande "find" ne la recevra pas (à noter que find ... -name 'a*' et find ... -name a\* fonctionnent aussi).
    On a aussi la même chose avec l'option "-exec" du find. Quand on demande à find d'exécuter une commande, il faut indiquer où la commande se termine via un point-virgule. Mais pour que le find reçoive ce point-virgule (c'est un caractère spécial du shell donc si le shell le voit sans protection il le traite à sa manière) il faut aussi le protéger => find ... -name ... -exec ls -l {} \;.

    La troisième est du même ordre. Il semble que la commande doive recevoir cette chaine "étoile" (ou ici "étoile/étoile") donc il faut protéger cette étoile du shell qui fait l'intermédiaire entre ce qu'il lit dans ton clavier et l'appel de la commande.

    Tout se résume en "c'est quoi la différence entre echo *, echo \*, echo '*' et echo "*""...
    PS: pour la première echo * il faut l'appeler dans un dossier non vide sinon ça affiche "étoile" à l'écran et on ne voit aucune différence avec les autres
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

Discussions similaires

  1. [PowerShell] Action d'une commande avec des pipes dans un fichier text
    Par Josh94666 dans le forum Scripts/Batch
    Réponses: 6
    Dernier message: 19/10/2015, 16h22
  2. Réponses: 12
    Dernier message: 02/07/2009, 18h07
  3. Précision sur fonction static d'une classe pour Thread
    Par thebop dans le forum Threads & Processus
    Réponses: 9
    Dernier message: 22/06/2009, 14h18
  4. pb sur le lancement d'une commande tftp
    Par Stef_M dans le forum Langage
    Réponses: 4
    Dernier message: 19/03/2008, 11h53
  5. Réponses: 5
    Dernier message: 01/07/2007, 20h25

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo