Question

Je voudrais appeler bash en utilisant une chaîne comme entrée. Quelque chose comme:

sh -l -c "./foo"

Je voudrais faire cela à partir de Java. Malheureusement, lorsque j'essaie d'appeler la commande à l'aide de getRuntime (). Exec , le message d'erreur suivant s'affiche:

      foo": -c: line 0: unexpected EOF while looking for matching `"'

      foo": -c: line 1: syntax error: unexpected end of file

Cela semble être lié au fait que ma chaîne ne se termine pas par un EOF.

Existe-t-il un moyen d'insérer un EOF spécifique à une plate-forme dans une chaîne Java? Ou devrais-je rechercher une autre approche, comme écrire dans un script temporaire avant d'appeler "sh"? ?

Était-ce utile?

La solution

Utilisez ceci:

Runtime.getRuntime().exec(new String[] {"sh", "-l", "-c", "./foo"});

Point principal: ne mettez pas les guillemets doubles. Cela ne sert que pour écrire une ligne de commande dans le shell!

Par exemple, echo "Hello, world!" (tel que saisi dans le shell) est traduit en:

Runtime.getRuntime().exec(new String[] {"echo", "Hello, world!"});

(Oubliez simplement pour le moment que le shell a normalement une fonction intégrée pour echo et appelle plutôt / bin / echo .: -))

Autres conseils

Les commandes Windows diffèrent de UNIX, Mac OS X et GNU / Linux.

Sous Windows, le processus reçoit le texte saisi tel quel après le nom exécutable (et l’espace). C’est ensuite au programme d’analyser la ligne de commande (ce qui est généralement fait implicitement et le programmeur n’a souvent aucune idée).

Sous GNU / Linux, le shell traite la ligne de commande et génère le tableau familier de chaînes passé au C principal. Tu n'as pas cette coquille. La meilleure approche (même sous Windows) consiste à utiliser la forme de exec où vous passez chaque argument de ligne de commande individuellement dans sa propre chaîne.

Vous pouvez obtenir un shell à analyser pour vous si vous le souhaitiez vraiment. Ce qui vous donnerait un exemple ressemblant à (non testé):

Runtime.getRuntime().exec(new String[] {
    "sh", "-c", "sh -l -c \"echo foo; echo bar;\""
});

EOF n'est PAS un caractère, il n'y a donc aucun moyen d'écrire un EOF. Vous avez oublié de fermer une chaîne entre guillemets.

La cause de cette erreur est probablement un jeton de syntaxe manquant attendu par bash, mais la chaîne que vous transmettez se termine avant que bash ne l'ait rencontré. Recherchez les ifs, les fors, etc. qui n’ont pas de clôture ni fait.

Les citations doivent être échappées à l'intérieur d'une chaîne. Au lieu d'écrire " écrire \ ".

ex.

strcpy (c, "Ceci est une chaîne" avec "guillemets");

si j'étais vous, j'écrirais le contenu de la chaîne dans un fichier bashfich temporaire pour voir si bash l'exécutait sans erreur. Si cela s’exécute sans erreur, j’envisagerais un débogage plus approfondi;

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top