Bonjour,
Je ne comprends pas pourquoi j'ai lerreur:
et comment faire pour y remédier?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 man cd Aucune entrée de manuel pour cd .
Merci d'avance.
Bonjour,
Je ne comprends pas pourquoi j'ai lerreur:
et comment faire pour y remédier?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 man cd Aucune entrée de manuel pour cd .
Merci d'avance.
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.
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 //![]()
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:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 #!/bin/sh cd "$@"![]()
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.
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
CafuroCafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
e-verbeUn logiciel de conjugaison des verbes de la langue française.
Ma page personnelle sur DVP.
Il s'agit surtout d'appeler la fonction système chdir.
Ce n'est pas la seule commande dans ce cas, et rien n'interdit d'implémenter une commande comme ça.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.
C'est d'ailleurs précisément à quoi je faisait allusion dans mon dernier post.
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).
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
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.
Partager