Shell Script (Bash): omite caracteres especiales

Shell Script (Bash): omite caracteres especiales

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 cmdmenos 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\\bazen $var.

Si no ve esas barras invertidas, $vareso sería porque no verificó si están allí correctamente, como mediante el uso de una implementación echoo printque interpreta las secuencias de escape de barras invertidas.

Por ejemplo, en el modo de conformidad UNIX, bash's echoda:

bash-4.3$ echo "$var"
foar\baz

(el \bfue ampliado a unretrocesocarácter que cuando se envía a una terminal hace que retroceda un carácter).

Tú quieresutilizar printfpara 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 lque 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ó $varfue 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 "\"

información relacionada