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 :

cd manuel absent


Sujet :

Shell et commandes GNU

  1. #1
    Membre très actif
    Profil pro
    Inscrit en
    Juin 2013
    Messages
    294
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2013
    Messages : 294
    Par défaut cd manuel absent
    Bonjour,

    Je ne comprends pas pourquoi j'ai lerreur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    man cd
    Aucune entrée de manuel pour cd
    .
    et comment faire pour y remédier?

    Merci d'avance.

  2. #2
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 651
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 651
    Par défaut
    Bonjour,

    cd est une commande interne du shell.
    si tu utilises bash : help cd,
    sinon man $0
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  3. #3
    Modérateur
    Avatar de jlliagre
    Homme Profil pro
    Ingénieur support avancé & développement
    Inscrit en
    Juin 2007
    Messages
    2 695
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur support avancé & développement
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 695
    Par défaut
    C'est surtout une conséquence du fait que Gnu ne fournit pas de binaire indépendant pour la commande cd, comme par exemple /usr/bin/cd, l'une des raisons pour lesquelles les systèmes basés sur Gnu/Linux ne sont pas conformes aux standard POSIX.

  4. #4
    Expert confirmé Avatar de frp31
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Juillet 2006
    Messages
    5 196
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juillet 2006
    Messages : 5 196
    Par défaut
    au pire elle est assez facile à écrire

    s'inspirer de celle là trouvé sur google :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    #include <errno.h>
    #include <fcntl.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <unistd.h>
    #include <sys/stat.h>
     
    void affiche_chemin_courant(void)
    {
        char * chemin = NULL;
        char * nouveau = NULL;
        int taille= 16;
     
        while(1)
        {
            if ((nouveau = realloc(chemin,taille))== NULL)
            {
                perror("realloc");
            }
            chemin = nouveau;
            if (getcwd(chemin,taille) != NULL)
            {
                fprintf(stdout, "%s\n" ,  chemin);
                break;
            }
            if (errno != ERANGE)
            {
                perror("getcwd"); break;
            } taille *= 2;
        }
        if (chemin != NULL)
            free(chemin);
    }
     
    void change_chemin_courant(char *nom)
    {
        int fd;
        if ((fd = open(nom, O_RDONLY)) <0) 
        {
            perror(nom);
            return;
        }
        if (fchdir(fd) <0)
            perror(nom);
        close(fd);
    }
     
    int main(int argc , char **argv)
    {
        int i;
        //affiche_chemin_courant();
        for (i = 0;i < argc; i++)
        {
            change_chemin_courant(argv[i]);
            affiche_chemin_courant();
        }
        return EXIT_SUCCESS;
    }
     
    //Execution
    //cd /usr/local/bin
    // ./cd /etc/ /usr/X11R6/include/X11/bitmaps/ /etc/inittab
     
    //=>
    // /usr/local/bin
    //

  5. #5
    Modérateur
    Avatar de jlliagre
    Homme Profil pro
    Ingénieur support avancé & développement
    Inscrit en
    Juin 2007
    Messages
    2 695
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur support avancé & développement
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 695
    Par défaut
    C'est plutôt la page de manuel qu'il faudrait écrire pour répondre à la question posée.

    Quant à l'implémentation, il y a plus simple:


  6. #6
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 347
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 347
    Par défaut
    Citation Envoyé par jlliagre Voir le message
    C'est surtout une conséquence du fait que Gnu ne fournit pas de binaire indépendant pour la commande cd, comme par exemple /usr/bin/cd, l'une des raisons pour lesquelles les systèmes basés sur Gnu/Linux ne sont pas conformes aux standard POSIX.
    La commande cd est obligatoirement une commande interne car il ne s'agit que de positionner les différentes variables tel que pwd, cwd, etc...

    Par exemple sous Solaris, la commande cd existe bien dans /usr/bin mais celle-ci n'est autre qu'un script qui appelle la builtin du shell.

  7. #7
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Par défaut
    Citation Envoyé par disedorgue Voir le message
    La commande cd est obligatoirement une commande interne car il ne s'agit que de positionner les différentes variables tel que pwd, cwd, etc...
    Je suis très d'accord mais pour une autre raison.

    Dans un shell, à chaque fois que l'on lance une commande, on fork/exec un nouveau process fils qui exécute cette commande.

    Si la commande "cd" était externe, c'est le fils qui changerait de répertoire, pas le parent (le shell). Quand on fait "cd", c'est bien pour que le shell change de répertoire.
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  8. #8
    Modérateur
    Avatar de jlliagre
    Homme Profil pro
    Ingénieur support avancé & développement
    Inscrit en
    Juin 2007
    Messages
    2 695
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur support avancé & développement
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 695
    Par défaut
    Citation Envoyé par disedorgue Voir le message
    La commande cd est obligatoirement une commande interne car il ne s'agit que de positionner les différentes variables tel que pwd, cwd, etc...
    Il s'agit surtout d'appeler la fonction système chdir.
    Par exemple sous Solaris, la commande cd existe bien dans /usr/bin mais celle-ci n'est autre qu'un script qui appelle la builtin du shell.
    Ce n'est pas la seule commande dans ce cas, et rien n'interdit d'implémenter une commande comme ça.
    C'est d'ailleurs précisément à quoi je faisait allusion dans mon dernier post.

  9. #9
    Modérateur
    Avatar de jlliagre
    Homme Profil pro
    Ingénieur support avancé & développement
    Inscrit en
    Juin 2007
    Messages
    2 695
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur support avancé & développement
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 695
    Par défaut
    Citation Envoyé par ram-0000 Voir le message
    Si la commande "cd" était externe, c'est le fils qui changerait de répertoire, pas le parent (le shell). Quand on fait "cd", c'est bien pour que le shell change de répertoire.
    En général mais pas forcément. C'est pour ça que le standard POSIX impose que la commande 'cd' soit aussi fournie en tant que commande externe comme je l'ai déjà écrit dans le post #3.

  10. #10
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 651
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 651
    Par défaut
    je viens de parcourir la description de la norme à propos de cd, et je n'y ai pas vu d'obligation que ce soit une commande externe (je peux avoir manqué le passage, ou l'avoir mal interprété...).
    par contre, il y est dit :
    Since cd affects the current shell execution environment, it is always provided as a shell regular built-in.
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  11. #11
    Modérateur
    Avatar de jlliagre
    Homme Profil pro
    Ingénieur support avancé & développement
    Inscrit en
    Juin 2007
    Messages
    2 695
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur support avancé & développement
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 695
    Par défaut
    Citation Envoyé par N_BaH Voir le message
    je viens de parcourir la description de la norme à propos de cd, et je n'y ai pas vu d'obligation que ce soit une commande externe (je peux avoir manqué le passage, ou l'avoir mal interprété...).
    par contre, il y est dit :
    >> Since cd affects the current shell execution environment, it is always provided as a shell regular built-in.
    Il est effectivement écrit que cd est toujours fourni en tant que built-in mais pas qu'il est seulement fourni en tant que built-in.

    POSIX définit la liste des commandes pour lesquelles une implémentation interne est obligatoire et donc pour lesquelles une implémentation sous forme de commande externe n'est pas exigée, il s'agit des "Special Built-Ins" suivantes:
    • break
    • :
    • continue
    • .
    • eval
    • exec
    • exit
    • export
    • readonly
    • return
    • set
    • shift
    • times
    • trap
    • unset

    Rien n'interdit cependant une implémentation externe même pour ces commandes.

    Par contre, cd ne fait pas partie de cette liste et doit donc, pour qu'un système d'exploitation puisse être certifié conforme au standard, obligatoirement être fourni aussi comme commande externe comme l'indique cette phrase du standard POSIX:

    However, all of the standard utilities, including the regular built-ins in the table, but not the special built-ins described in Special Built-In Utilities, shall be implemented in a manner so that they can be accessed via the exec family of functions as defined in the System Interfaces volume of POSIX.1-2008 and can be invoked directly by those standard utilities that require it (env, find, nice, nohup, time, xargs).

  12. #12
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 347
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 347
    Par défaut
    Hé, je ne remettais pas en cause le cas du POSIX (je ne le connais pas assez pour ça ).
    Je ne faisais que préciser (bon j'admet, un peu fortement) que cd, de par sa nature à tout intéret à être une builtin.

    Sinon, jlliagre (ou un homologue), avait donné 2 exemples qui montre le bien fondé de cet exigence POSIX:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    find . -type d -exec cd {} \;
    env HOME=/foo cd

  13. #13
    Modérateur
    Avatar de jlliagre
    Homme Profil pro
    Ingénieur support avancé & développement
    Inscrit en
    Juin 2007
    Messages
    2 695
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur support avancé & développement
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 695
    Par défaut
    Citation Envoyé par disedorgue Voir le message
    Sinon, jlliagre (ou un homologue), avait donné 2 exemples qui montre le bien fondé de cet exigence POSIX:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    find . -type d -exec cd {} \;
    env HOME=/foo cd
    C'est bien moi. Voir aussi ce lien où je cite Dennis Ritchie qui expliquait que cd n'était pas un built-in du shell dans les premières implémentations beta d'Unix.

Discussions similaires

  1. Réponses: 12
    Dernier message: 21/06/2004, 10h44
  2. ecrire manuellement dans une dbgrid
    Par neness dans le forum Bases de données
    Réponses: 4
    Dernier message: 16/06/2004, 11h14
  3. Man signal, man scanf => pas de manuel
    Par weed dans le forum Applications et environnements graphiques
    Réponses: 6
    Dernier message: 17/05/2004, 16h31
  4. [SQL] Ma requête m'oblige à saisir des valeurs manuellement
    Par bossun dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 22/10/2003, 13h29
  5. Assemblage manuel
    Par syraks dans le forum Assembleur
    Réponses: 4
    Dernier message: 01/06/2003, 00h08

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