Los argumentos son manejados por el intérprete de comandos (supongo que está utilizando bash en Linux?), Por lo que las configuraciones de terminal no deberían afectar esto. Como ya has citado el argumento, debería funcionar. La única explicación posible que puedo pensar es si su comando java
es un script de contenedor y arruina el escape de los argumentos al pasar al programa real. Esto es fácil de hacer, o quizás un poco difícil de hacer correctamente.
Un script de contenedor correcto debe pasar todos sus argumentos como ${1+"[email protected]"}
, cualquier otra versión es muy probablemente un error con respecto a poder manejar los espacios integrados correctamente. No es raro hacerlo correctamente, sin embargo, cualquier ocurrencia de $2
o similar es problemática y debe escribirse como "$2"
(o posiblemente ${2+"$2"}
) para manejar correctamente los espacios integrados, y esto se debe a muchos.
La razón de la sintaxis no es tan intuitivo ${1+"[email protected]"}
que el original $*
se unieron todos los argumentos que "$1 $2 $3 ..."
que no funcionaba para espacios incrustados. Luego se introdujo "[email protected]"
que (correctamente) se expandió a "$1" "$2" "$3" ...
para todos los parámetros y, si no se proporcionan parámetros, debería expandirse a nada. Desafortunadamente, un vendedor de Unix cometió un error e hizo que "[email protected]"
se expandiera a ""
incluso en el caso de que no hubiera argumentos, y para solucionar esto se inventó el hack inteligente (pero no tan legible) ${1+"[email protected]"}
, haciendo que "[email protected]"
solo se expanda si se establece el parámetro $1
evitando la expansión en caso de no tener argumentos).
Si mi suposición es incorrecta envoltorio se podría intentar depurar con strace
strace -o outfile -f -ff -F java test.AskGetCampaignByName "Dummy books"
y averiguar qué argumentos se pasan a execve. Ejemplo de correr "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)
...
Muchas gracias hlovdal! Ese fue exactamente el caso. Generamos un ejecutable a través de ant build que establece los classpaths etc. Y usamos "java @" en el script. Sustituir tu $ {1 + "@"} resolvió el problema. Lo siento por engañar al usar Java directamente en mi ejemplo. Supuse que significa lo mismo – ashweta