Voici mon code :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
|
#include <stdio.h>
#include <stdlib.h>
int main ( int argc, char *argv[] )
{
int retour=0;
char *arg []={"cp","*",argv[1],NULL};
if ( argc== 1)
{
execv("/bin/cp",arg);
}
else
{
printf ( "usage : argument1 arg1\n" );
}
/* Jamais execute si ma commande à été exécuté mais bon c'est juste pour tester ! */
return EXIT_SUCCESS;
} |
Si je tente grace à ce code d'executer la commande "cp * ../test" pour copier le contenu du repertoire a partir duquel j'execute mon pg, cela échoue, il ne trouve pas "*".
(je lance le pg en ecrivant ./nomDuPg ../test en me plaçant dans le repertoire de mon exe)
En revanche si je spécifie un nom de fichier au lieu de * cela fonctionne bien.
Je pense savoir d'ou cela provient :
Si je tape cp * ../test dans une console, le shell "traduit" le caractere * en la liste des fichier du repertoire avant (entre autre) d'exécuter /bin/cp avec ces noms comme parametre.
Lorsque j'utilise execv je donne directement comme parametre à cp "*" qui n'est pas traduit par le shell en la liste des fichiers du repertoire.
Mes questions :
- Mon interprétation est-elle correcte ? En effet j'ai trouvé sur plusieurs sites des personnes qui utilise execv avec * pour copier tout le repertoire par exemple. Donc si ca marche chez eux pourquoi pas chez moi ?
- Quelle est la solution pour grace à exec pouvoir utiliser les caratères spéciaux du shell dans une commande ?
Partager