Java CLI Apache Commons sous Unix; > est traité comme un argument de l’exécutable au lieu d’une redirection

J’essaie d’automatiser certains tests en ligne de commande sur Windows et Unix. J’utilise Java 1.6 et Apache Commons CLI 1.1 pour ce faire. Ce que je fais dans le code Java consiste à créer la commande que je veux exécuter en utilisant la méthode addMgument CLI Apache Commons. Après avoir construit la ligne de commande que je veux exécuter, je voulais diriger la sortie de la commande vers un fichier afin d’append ce qui suit à la fin de la commande

cloudscan_cmdl.addArgument(">"); cloudscan_cmdl.addArgument(cloudscanOutputFilename); 

Où cloudscanOutputFilename est la chaîne contenant le nom de fichier que je veux utiliser. Cela fonctionne très bien sous Windows, la commande est construite, les deux arguments redirigés sont ajoutés et le fichier est créé correctement. Sur Unix, cependant, il traite les chaînes de caractères> et nom de fichier comme des arguments supplémentaires pour l’exécutable au lieu de les redirect.

Que puis-je faire pour que Unix lise cette commande comme si elle était tapée directement comme celle de la ligne de commande? J’ai sorti la commande sous forme de chaîne et l’ai copiée et collée sous Unix et cela fonctionne comme prévu, mais lorsqu’elle est exécutée à partir du programme Java, la redirection n’est pas traitée correctement.

J’ai essayé d’utiliser la version addArgument (ssortingng, boolean) de la méthode comme étant à la fois true et false et aucune aide. Cela me rend vraiment fou.

Vous interprétez mal le but de la classe . Comme indiqué, il “spécifie les processus à exécuter”. Cela vous aide à passer une liste d’arguments à un programme. Ce n’est pas pour dire au shell quoi faire. > est un opérateur de redirection implémenté par le shell. Le fait que cela fonctionne sous Windows est un accident.

Notez également que cela fait partie d’ Apache Commons Exec , pas d’ Apache Commons CLI .

Pour éviter de faire la redirection vous-même, votre meilleure option pourrait être de créer un simple fichier de commandes ou un script de shell pour chaque plate-forme et de l’appeler.

Escape > , par exemple

 cloudscan_cmdl.addArgument("\>");