Подтвердить что ты не робот

Пространство в аргументах командной строки Java

В моих аргументах командной строки Java любые символы после пробела игнорируются. Например,

java test.AskGetCampaignByName "Dummy books"

Я получаю первый аргумент (args [0]) только как "Dummy". Одиночные кавычки также не помогают. Кто-нибудь знает об обходном пути/исправлении для этого? Может быть, из-за моих настроек терминала? Мой $TERM - xterm, а $LANG - "en_IN".

4b9b3361

Ответ 1

Аргументы обрабатываются оболочкой (я предполагаю, что вы используете bash под linux?), поэтому любые настройки терминала не должны влиять на это. Поскольку вы уже цитировали аргумент, он должен работать. Единственное возможное объяснение, о котором я могу думать, заключается в том, что ваша команда java является оберткой script и испортит экранирование аргументов при передаче в реальную программу. Это легко сделать, или, возможно, немного сложно сделать правильно.

Правильная оболочка script должна передать все свои аргументы как ${1+"[email protected]"}, любая другая версия, скорее всего, является ошибкой в ​​отношении возможности правильно обрабатывать внедренные пространства. Это не редкость делать правильно, однако любые вхождения $2 или подобных проблем являются неприятными и должны быть записаны как "$2" (или, возможно, ${2+"$2"}), чтобы правильно обрабатывать внедренные пространства, и это согрешило против большого количества.

Причиной не столь интуитивного синтаксиса ${1+"[email protected]"} является то, что исходный $* соединял все аргументы как "$1 $2 $3 ...", который не работал для встроенных пространств. Затем было введено "[email protected]", которое (правильно) было расширено до "$1" "$2" "$3" ... для всех параметров, и если никаких параметров не задано, оно должно расширяться до нуля. К сожалению, какой-то unix-разработчик испортил и сделал "[email protected]" расширяться до "" даже в случае отсутствия аргументов, и для этого можно было придумать умный (но не очень читаемый) взлом записи ${1+"[email protected]"}, сделав "[email protected]" только expand, если установлен параметр $1 (т.е. избегать расширения в случае отсутствия аргументов).

Если мое предположение об упаковке неверно, вы можете попробовать отладить с strace

strace -o outfile -f -ff -F java test.AskGetCampaignByName "Dummy books"

и выясните, какие аргументы передаются execve. Пример из запуска "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)
...

Ответ 2

Вам просто нужно избежать пробелов, подобных этому:

normal String: "Hello World!"
escaped String: "Hello" "World!"

Это сработало для меня.

Моя среда:

23:39:19 [email protected]:/Users/Zarathustra~$bash -version
GNU bash, version 3.2.48(1)-release (x86_64-apple-darwin11)
Copyright (C) 2007 Free Software Foundation, Inc.

Ответ 3

Если ваша программа нуждается в более чем позиционных аргументах (= при использовании командной строки важно), вы должны рассмотреть варианты и переключатели. Для этого Apache Commons имеет большую .

Ответ 4

Похоже, что вы используете дистрибутив операционной системы, где доступная пользователю команда java является оболочкой, которая находит нужную JVM "где-то" и вызывает ее соответствующим образом.

Если это так, то он, скорее всего, не избежит аргументов при вызове фактического исполняемого файла java.

Какое распространение вы используете?

Ответ 5

Этот вопрос немного стар, но почему бы вам просто не собрать арги в своей Java-программе?

StringBuilder allArgs = new StringBuilder();
for (int i=0; i < args.length; i++)
{
    //System.out.println("arg"+i+": "+args[i]);
    allArgs.append(args[i]+" ");
}
//Parse out the args the way you wish using allArgs