NSTask, pas facile!
tablier
Membre
J'ai parmi d'autres commandes, les deux commandes suivantes à faire exécuter:
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 .... ?
/cheminx/ibtool --generate-stringsfile '/cheminy/fichier.strings' '/cheminz/fichier.nib'<br />/cheminx/ibtool --hierarchy --objects '/cheminz/fichier.nib' > '/cheminy/fichier.plist'
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 .... ?
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
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)
Il faut spécifier l'exécutable et les arguments dans la méthode startTask de la classe Controller
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).