Tengo un script de shell que ejecuta un archivo jar y almacena el resultado generado al ejecutar el archivo jar en una variable.
P.ej:
myvariable=$(java -jar MyJavaJarFile.jar)
Sin embargo, el resultado cuando ejecuto la instrucción Java que se proporciona a continuación consta de caracteres especiales como /, \, +, =, etc. Pero cuando se almacena en la variable, caracteres como \ se omiten de la variable.
java -jar MyJavaJarFile.jar
Si la salida real es abc=\=abc
, entonces la variable solo se almacena abc==abc
.
¿Alguien podría ayudarme con esto? Gracias.. :)
Respuesta1
La sustitución de comandos ( $(cmd)
o `cmd`
(también ${ cmd;}
en ksh93)) almacena la salida estándar cmd
menos los caracteres de nueva línea finales (a menos que esa salida contenga bytes NUL en shells distintos de zsh
).
No hace nada especial con la barra invertida. Los únicos caracteres con los que puede equivocarse son el carácter NUL (y todos los caracteres posteriores a la primera aparición de NUL en algunos shells) y los caracteres de nueva línea finales.
var=$(printf '%s\n\n\n' 'foo\bar\\baz')
Se almacenará foo\bar\\baz
en $var
.
Si no ve esas barras invertidas, $var
eso sería porque no verificó si están allí correctamente, como mediante el uso de una implementación echo
o print
que interpreta las secuencias de escape de barras invertidas.
Por ejemplo, en el modo de conformidad UNIX, bash
's echo
da:
bash-4.3$ echo "$var"
foar\baz
(el \b
fue ampliado a unretrocesocarácter que cuando se envía a una terminal hace que retroceda un carácter).
Tú quieresutilizar printf
para generar datos arbitrarios(y no olvide citar sus variables):
bash-4.3$ printf '%s\n' "$var"
foo\bar\\baz
Y cuando esa salida va a una terminal, es posible que desee posprocesarla para sed -n l
que los caracteres de control o los espacios finales, por ejemplo, se vuelvan visibles.
O es porque esas barras invertidas no se generaron en la salida estándar. Por ejemplo:
foo() {
printf foo
printf '\\' >&2
printf 'bar\n'
}
Al ejecutar esa función:
bash-4.3$ foo
foo\bar
bash-4.3$ var=$(foo)
\bash-4.3$ printf '%s\n' "$var"
foobar
El \
que no llegó $var
fue enviado a stderr.
O, por supuesto, podría deberse a que no se generan en absoluto como sugiere su comentario a la respuesta de Benjo, pero eso sería un problema en su aplicación Java, no bash
.
Respuesta2
Intentar
myvariable="$(java -jar MyJavaJarFile.jar)"
Y debería almacenarlo como una cadena que también debería mostrar "\"