Ответ 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)
...