Les arguments sont traités par le shell (je suppose que vous utilisez bash sous linux?), Donc les paramètres du terminal ne devraient pas affecter cela. Puisque vous avez déjà cité l'argument, cela devrait fonctionner. La seule explication possible que je peux penser est si votre commande java
est un script de wrapper et salit l'échappement des arguments lors de la transmission au vrai programme. C'est facile à faire, ou peut-être un peu difficile à faire correctement. Un script wrapper correct doit passer tous ses arguments sur ${1+"[email protected]"}
, toute autre version est probablement un bogue en ce qui concerne la gestion correcte des espaces incorporés. Ce n'est pas rare à faire correctement, cependant toutes les occurrences de $2
ou similaire sont gênantes et doivent être écrites comme "$2"
(ou éventuellement ${2+"$2"}
) afin de gérer correctement les espaces incorporés, et ceci est péché contre beaucoup.
La raison de la syntaxe pas si intuitive ${1+"[email protected]"}
est que l'original $*
a joint tous les arguments comme "$1 $2 $3 ..."
qui ne fonctionnait pas pour les espaces incorporés. Puis "[email protected]"
a été introduit que (correctement) étendu à "$1" "$2" "$3" ...
pour tous les paramètres et si aucun paramètre n'est donné, il devrait s'étendre à rien. Malheureusement, certains fournisseurs d'Unix se sont trompés et ont fait "[email protected]"
étendre à ""
même en l'absence d'arguments, et pour contourner ce problème, le piratage intelligent (mais pas si lisible) de l'écriture ${1+"[email protected]"}
a été inventé, rendant "[email protected]"
uniquement si le paramètre $1
est activé (ie éviter l'expansion en l'absence d'arguments).
Si mon hypothèse d'emballage est erroné, vous pouvez essayer de déboguer avec strace
strace -o outfile -f -ff -F java test.AskGetCampaignByName "Dummy books"
et savoir quels arguments sont passés à execve. Exemple de fonctionnement « strace /bin/echo '1 2' 3
»
execve("/bin/echo", ["/bin/echo", "1 2", "3"], [/* 93 vars */]) = 0
brk(0) = 0x2400000
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f420075b000
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f420075a000
access("/etc/ld.so.preload", R_OK) = -1 ENOENT (No such file or directory)
open("/usr/lib64/alliance/lib/tls/x86_64/libc.so.6", O_RDONLY) = -1 ENOENT (No such file or directory)
stat("/usr/lib64/alliance/lib/tls/x86_64", 0x7fff08757cd0) = -1 ENOENT (No such file or directory)
open("/usr/lib64/alliance/lib/tls/libc.so.6", O_RDONLY) = -1 ENOENT (No such file or directory)
...
Merci beaucoup hlovdal! C'était exactement le cas. Nous générons un exécutable à l'aide de la construction ant qui définit les chemins de classes, etc. Et nous utilisions "java @" dans le script. La substitution de votre $ {1 + "@"} a résolu le problème. Désolé de tromper en utilisant java directement dans mon exemple. Je supposais que cela signifiait la même chose – ashweta