Eu tenho um script de shell que executa um arquivo jar e armazena a saída gerada pela execução do arquivo jar em uma variável.
Por exemplo:
myvariable=$(java -jar MyJavaJarFile.jar)
No entanto, a saída quando executo a instrução Java fornecida abaixo consiste em caracteres especiais como /, \, +, =, etc. Mas quando é armazenado na variável, caracteres como \ são omitidos da variável.
java -jar MyJavaJarFile.jar
Se a saída real for abc=\=abc
, a variável será armazenada apenas abc==abc
.
Alguém poderia me ajudar com isso? Obrigado.. :)
Responder1
A substituição de comando ( $(cmd)
ou `cmd`
(também ${ cmd;}
em ksh93)) armazena a saída padrão cmd
menos os caracteres de nova linha finais (a menos que essa saída contenha bytes NUL em shells diferentes de zsh
).
Não faz nada de especial com a barra invertida. Os únicos caracteres com os quais ele pode atrapalhar são o caractere NUL (e todos os caracteres após a primeira ocorrência de NUL em alguns shells) e os caracteres de nova linha finais.
var=$(printf '%s\n\n\n' 'foo\bar\\baz')
Armazenará foo\bar\\baz
em $var
.
Se você não vir essas barras invertidas, $var
será porque você não verificou se elas estão lá corretamente, como usando uma implementação echo
ou print
que interpreta sequências de escape de barra invertida.
Por exemplo, no modo de conformidade UNIX, bash
fornece echo
:
bash-4.3$ echo "$var"
foar\baz
(o \b
foi expandido para umretrocedercaractere que, quando enviado a um terminal, retrocede um caractere).
Você queruse printf
para gerar dados arbitrários(e não se esqueça de citar suas variáveis):
bash-4.3$ printf '%s\n' "$var"
foo\bar\\baz
E quando essa saída vai para um terminal, você pode querer pós-processá-la para sed -n l
que caracteres de controle ou caracteres de espaço à direita, por exemplo, fiquem visíveis.
Ou é porque essas barras invertidas não foram geradas no stdout. Por exemplo:
foo() {
printf foo
printf '\\' >&2
printf 'bar\n'
}
Ao executar essa função:
bash-4.3$ foo
foo\bar
bash-4.3$ var=$(foo)
\bash-4.3$ printf '%s\n' "$var"
foobar
O \
não conseguiu chegar e $var
foi enviado para stderr.
Ou, claro, pode ser porque eles não são produzidos, como sugere o seu comentário à resposta de Benjo, mas isso seria um problema no seu aplicativo Java, não bash
.
Responder2
Tentar
myvariable="$(java -jar MyJavaJarFile.jar)"
E deve armazená-lo como uma string que também deve mostrar o "\"