web-dev-qa-db-fra.com

Comment passer des arguments du script shell wrapper à Java application?

Je veux exécuter Java les programmes que je crée sur la ligne de commande (linux et mac). Je ne veux pas taper "Java" et les arguments tout le temps, donc je pense à créer des scripts wrapper. Quelle est la meilleure façon de le faire pour qu'ils fonctionnent partout? Je veux aussi pouvoir passer des arguments. Je pensais utiliser "shift" pour cela (en supprimant le premier argument).

Existe-t-il une meilleure façon de le faire sans utiliser de scripts? Peut-être faire un exécutable qui ne nécessite pas d'appel via la commande "Java"?

24
gonzobrains

En supposant que vous utilisez un Shell compatible avec le Bourne Shell; par exemple. sh, bash, ksh, etc., l'encapsuleur suivant transmettra tous les arguments de ligne de commande à la commande Java:

#!/bin/sh
OPTS=... 
Java $OPTS com.example.YourApp "$@"

Le $@ se développe pour les arguments restants du script Shell, et le fait de mettre des guillemets autour de lui entraîne la citation individuelle des arguments, de sorte que les éléments suivants passent un seul argument à Java:

$ wrapper "/home/person/Stupid Directory Name/foo.txt" 

Sans les guillemets doubles autour de "$@" dans le script wrapper, Java recevrait trois arguments pour ce qui précède.


Notez que cela ne fonctionne pas avec "$*". Selon l'entrée manuelle bash:

"$*" est équivalent à "$1c$2c...", où c est le premier caractère de la valeur de la variable IFS.

En d'autres termes, tous les arguments Shell seraient concaténés en un seul argument de commande pour votre application Java, en ignorant les limites de Word d'origine.

Reportez-vous au manuel bash ou sh ... ou à la spécification POSIX Shell ... pour plus d'informations sur la façon dont le shell gère les citations.

45
Stephen C

Vous pouvez créer un script Shell qui accepte les arguments . Dans votre script Shell, cela ressemblera à ceci: -

Java YourApp $1 $2

Dans ce cas, YourApp accepte deux arguments. Si votre script Shell est appelé app.sh, vous pouvez l'exécuter comme ceci: -

./app.sh FirstArgument SecondArgument 
6
limc