Shell Script (Bash): omite caracteres especiais

Shell Script (Bash): omite caracteres especiais

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

Se você não vir essas barras invertidas, $varserá porque você não verificou se elas estão lá corretamente, como usando uma implementação echoou printque interpreta sequências de escape de barra invertida.

Por exemplo, no modo de conformidade UNIX, bashfornece echo:

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

(o \bfoi expandido para umretrocedercaractere que, quando enviado a um terminal, retrocede um caractere).

Você queruse printfpara 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 lque 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 $varfoi 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 "\"

informação relacionada