参数由shell处理(我假设你在linux下使用bash),所以任何终端设置不应该影响这个。因为你已经引用了这个论点,它应该工作。我可以想到的唯一可能的解释是,如果你的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)
...