[Résolu] NSTask : comment exécuter un binary comme si on était dans un terminal?

colas_colas_ Membre
avril 2014 modifié dans API AppKit #1

Bonjour !


 


J'ai un problème avec NSTask. Je veux lui faire exécuter un programme, mais j'ai besoin de lui faire exécuter le programme comme si cela était fait via un terminal. Pourquoi cette contrainte ? Il semble que ce soit à  cause de variables d'environnement que le programme en question a besoin de connaà®tre.


 


J'ai essayé ce qui suit, mais ça ne marche pas. Pour tester mon idée, j'essaye de faire ce qui suit: 


  • via NSTask lancer un terminal
  • exécuter dans ce terminal la command 'ls /' (avec les simple quotes)

ça ne marche pas et j'ai l'erreur suivante dans mon log "/bin/bash: ls /: No such file or directory". Ce qui est étrange, c'est que si je mets la command "ls /" sans simple quotes au lieu de la commande "'ls /'", ça marche.


 


Alors, me direz-vous, il suffit d'enlever les simple quotes !! Oui, mais si je veux exécuter via NSTask (et via un environnement shell) la commande 



$ myprogram myfile.ext

si je ne mets pas de quotes, il lance `myprogram` mais sans prendre en compte l'option `/path/to/file/myfile.ext`.


 


Voici le code que j'essaye.



    NSTask * myTask = [[NSTask alloc] init];
    
    // ne marche pas
    NSArray * arguments = @[;@-c, @-l, @'ls /'];
    // marche
    // NSArray * arguments = @[;@-c, @-l, @ls /];
    
    //
    // Pour lancer un binary
    //
    // NSArray * arguments = @[;@-c, @-l, @'myprogram /path/to/file/myfile.ext'];

    [myTask setCurrentDirectoryPath:@/];
    [myTask setLaunchPath:@/bin/bash];
    [myTask setArguments:arguments];
    
    [myTask launch] ;

Merci si vous avez des idées !!!


 


PS : si j'exécute dans un terminal la commande



$ /bin/bash -c -l 'myprogram /path/to/file/myfile.ext'

ça marche... Je voudrais la même chose, mais depuis une NSTask.


Réponses

  • CéroceCéroce Membre, Modérateur
    avril 2014 modifié #2

    Sans doute qu'il faut donner le chemin complet de myfile.ext. Autrement, myprogram cherche un fichier dans le répertoire courant (a priori, le launch path) et ne le trouve pas.


  • Merci @Céroce de ta réponse. Bonne idée, mais ça ne marche pas :(


     


    (en fait, j'avais déjà  essayé)


  • MalaMala Membre, Modérateur
    avril 2014 modifié #4

    et si tu localises la commande ls? Genre /bin/ls


  • J'ai déjà  essayé aussi... et ça ne marche pas :(


  • MalaMala Membre, Modérateur
    avril 2014 modifié #6

    Je viens de tester chez moi. Vires tes simples guillemets autour de ton ls. ;)


     


    Edit: pardon, tu avais déjà  vu. J'ai lu trop vite.


  • Oui Mala, je sais !!


     


    Mais dans l'exemple que je dois tester en vrai, j'ai besoin de ces simple quotes !!


     


    Essaye par exemple d'enlever les simple quotes dans cette ligne de code (remplace "colas" par ton nom d'utilisateur), tu vas voir ça va buguer... (alors que ça marche dans un terminal)



         NSArray * arguments = @[;@-c, @-l, @'pico /Users/colas/myfile.txt'];
  • Merci de votre aide !


     


    La solution était en fait plus simple !!!


    Il n'est pas nécessaire de passer par "/bin/bash" : il suffisait, grâce à  la méthode `setEnvironment:` de donner à  la NSTask les bonnes variables d'environnement.


Connectez-vous ou Inscrivez-vous pour répondre.