在我的Java命令行参数中,空格后的任何字符都会被忽略.例如,
java test.AskGetCampaignByName "Dummy books"
Run Code Online (Sandbox Code Playgroud)
我得到的第一个参数(args [0])仅为"Dummy".单引号也没有帮助.有解决方法/解决方法吗?可能是因为我的终端设置?
我的$ TERM是xterm,$ LANG是"en_IN".
hlo*_*dal 54
参数由shell处理(我假设您在Linux下使用Bash?),因此任何终端设置都不应该影响这一点.
因为你已经引用了这个论点,它应该有效.我能想到的唯一可能的解释是,如果你的java命令是一个包装器脚本,并且在传递给真正的程序时会弄乱参数的转义.这很容易做到,或者可能有点难以正确完成.
正确的包装器脚本应该将所有参数传递给as ${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"
Run Code Online (Sandbox Code Playgroud)
并找出传递给哪些参数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)
...
Run Code Online (Sandbox Code Playgroud)