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

(Я не думаю, что вы предоставили достаточно контекста, чтобы полностью ответить на свой вопрос, но я постараюсь на основе того, что вы мне дали.)

Это правильный путь чтобы выразить эту идею?

blockquote>

Так как вы, кажется, обеспокоены производительностью - вероятно, нет. Вызов функции через указатель на функцию (edit :) часто дорогой. Более того, эта функция даже не получает значение поля t при его вызове ... так что это, вероятно, даже не сработает.

Что делать, затем?

Во-первых, выяснить, если это даже болевая точка w.r.t. спектакль. Не просто оптимизируйте это, потому что есть потенциал для оптимизации.

Предполагая, что это полезно для оптимизации - старайтесь избегать всей этой материализации результатов. Вместо этого определите, какой тип поплавка нуждается в его норме, а затем попытайтесь приложить некоторые усилия, чтобы получить эту норму; это не будет так уж плохо, поскольку вы будете выполнять работу только с одним фрагментом данных, а не со всеми.

PS - В наши дни не нужно использовать союзы, у нас есть std::variant в C ++ 17. Это также спасет вас от логического значения.

28
задан Peter Mortensen 31 October 2018 в 21:26
поделиться

3 ответа

Аргументы обрабатываются оболочкой (я предполагаю, что вы используете Bash под Linux?), поэтому любые настройки терминала должны не влияет на это.

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

Правильный скрипт-обертка должен передавать все свои аргументы как $ {1+ " это должно работать. Единственное возможное объяснение, которое я могу придумать, - это если ваша команда java является сценарием-оберткой и портит экранирование аргументов при передаче в реальную программу. Это легко сделать или, возможно, немного сложно сделать правильно.

Правильный скрипт-обертка должен передавать все свои аргументы как $ {1+ " это должно работать. Единственное возможное объяснение, которое я могу придумать, - это если ваша команда java является сценарием-оберткой и портит экранирование аргументов при передаче в реальную программу. Это легко сделать или, возможно, немного сложно сделать правильно.

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

Причина не столь интуитивного синтаксиса $ {1+ " $ @ "} заключается в том, что оригинальный $ * объединил все аргументы как "$ 1 $ 2 $ 3 ... ", который не работал для встроенных пространств. Тогда " $ @" было введено, что (правильно) расширено до " $ 1 "" $ 2 "" $ 3 "... для всех параметров, и если параметры не заданы, он должен расширяться до нуля. К сожалению, некоторые поставщики Unix испортили и сделал " $ @ " расширением до "" даже в случае отсутствия аргументов, и обойти это умным (но не очень читаемым) взломом написания $ {1+ " $ @ "} было изобретено, делая " $ @« раскрывается только в том случае, если установлен параметр $ 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)
...
54
ответ дан 28 November 2019 в 03:13
поделиться

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

0
ответ дан nxadm 28 November 2019 в 03:13
поделиться

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

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

Какой дистрибутив выполняет Вы используете?

0
ответ дан Peter Mortensen 28 November 2019 в 03:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: