NSTask, pas facile!

tabliertablier Membre
15:15 modifié dans API AppKit #1
J'ai parmi d'autres commandes, les deux commandes suivantes à  faire exécuter:
/cheminx/ibtool --generate-stringsfile &#39;/cheminy/fichier.strings&#39; &#39;/cheminz/fichier.nib&#39;<br />/cheminx/ibtool --hierarchy --objects &#39;/cheminz/fichier.nib&#39; &gt; &#39;/cheminy/fichier.plist&#39;
La première commande crée directement le fichier .strings sans passer par la sortie standard.
La deuxième commande redirige (>) la sortie standard sur le fichier .plist à  créer.
Si J'exécute ces commandes dans le terminal ou en AppleScript par un "do shell script ..." j'obtiens exactement les fichiers souhaités.
Je n'ai pas réussi à  écrire une méthode qui exécute les deux commandes sous NSTask car il faut capturer la sortie standard dans un cas et pas dans l'autre cas.  Est-il possible dans un NSTask de laisser agir le > pour obtenir directement le fichier nommé sans passer par  NSPipe, setStandardOuput, NSFileHandle .... ?

Réponses

  • AliGatorAliGator Membre, Modérateur
    15:15 modifié #2
    Non ce n'est pas possible, car c'est le travail du schell que tu vois là . Un shell (interpréteur de commande, ça porte bien son nom) interprète les commandes tapées en mode texte (dans le terminal ou quand tu les passes par "do shell script") pour :
    1) Séparer les différents arguments (en trouvant où sont les espaces dans le texte tapé, tout en échappant les espaces qui sont échappés soit en étant entre guillemets, soit en étant échappés par un anti-slash)
    2) Interpréter les éventuelles variables, etc...
    3) Gérer les redirections demandées avec ">" ou "|" ou "<" ou autre
    4) Et plein d'autres choses (interpréter les structures de boucles et autre par exemple)
    5) Et enfin et seulement enfin, exécuter la commande ainsi construite (et c'est seulement ça qui correspond à  ton NSTask).

    Toi quand tu utilises NSTask, c'est donc à  toi de découper les arguments (là  où le shell les découpe et aussi échappe les espaces et qu'il faut penser à  mettre des guillemets autour des arguments qui peuvent avoir des espaces dans leur contenu), avec NSTask tu utilises directement un NSArray et n'a pas à  mettre les arguments entre guillemets etc... et à  toi de gérer les redirections aussi.

    Après une redirection via NSTask ce n'est pas bien méchant, mais c'est vrai que si tu veux un code générique bah il faut le prévoir dans ton code, par exemple en passant non pas juste une commande en paramètre, mais d'y ajouter un paramètre optionnel indiquant le chemin de fichier de sortie (s'il est nil ça ne fait rien de spécial mais s'il n'est pas nil tu rediriges vers le fichier).
    D'autant que finalement une redirection vers un fichier cela revient au niveau Cocoa de faire une NSTask avec comme standardOutput un NSPipe que tu vas lire pour stocker le contenu dans un fichier (d'ailleurs me demande si y'a même pas plus direct que de lire le NSPipe et ensuite écrire le contenu lu dans un fichier, y'a sans doute moyen de créer un NSPipe dont le fileHandleForWriting pointe direct sur un fichier ? A voir)
  • mpergandmpergand Membre
    15:15 modifié #3
    Un exemple de gestion de NSTask, si ça peut aider.

    Il faut spécifier l'exécutable et les arguments dans la méthode startTask de la classe Controller
  • tabliertablier Membre
    15:15 modifié #4
    Ce qui me fout les boules, ce n'est pas d'utiliser des NSTask. C'est d'utiliser ibtool qui parait assez incohérent. Grosso modo, ibtool produit des .strings, des (.nib ou .xib) et des .plist. Seuls les .plist sont envoyés sur la sortie standard. Les autres fichiers sont générés directement dans le disque dur.
  • AliGatorAliGator Membre, Modérateur
    15:15 modifié #5
    Les .strings c'est pas trop étonnant qu'il évite de les écrire sur la sortie standard, les .strings sont en UTF-16, encodage qu'en général le terminal utilisé ne supporte pas super bien. Mais c'est vrai qu'après ça pourrait être plus cohérent.

    A la limite une solution serait de faire une encapsulation de ibtool dans un script shell perso, tu t'écris un ou plusieurs petit script shell qui prend les paramètres que tu veux et écrit la sortie où tu veux à  chaque fois, et ce sont ces scripts que tu exécutes avec tes NSTasks. Quitte à  inclure ensuite ces scripts dans le bundle de ton application Cocoa (dans les ressources).

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