A substituição de comandos ( $(cmd)
ou 'cmd'
(também ${ cmd;}
in ksh93)) armazena a saída padrão de cmd
menos os caracteres de nova linha à direita (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 que podem ser confundidos são o caractere NUL (e todos os caracteres após a primeira ocorrência de NUL em alguns shells) e os caracteres iniciais de nova linha.
var=$(printf '%s\n\n\n' 'foo\bar\baz')
Armazenará foo\bar\baz
em $var
.
Se você não vir essas barras invertidas em $var
, isso pode 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. / p>
Por exemplo, no modo de conformidade com o UNIX, bash
' echo
dá:
bash-4.3$ echo "$var"
foar\baz
(o \b
foi expandido para um caractere backspace que, quando enviado para um terminal, faz com que ele retroceda um caractere).
Você deseja usar 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 a saída vai para um terminal, você pode querer pós-processá-lo com sed -n l
, para que caracteres de controle ou caracteres de espaço à direita, por exemplo, se tornem visíveis.
Ou é porque essas barras invertidas não foram impressas 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 chegou a $var
de saída para stderr.
Ou é claro, pode ser porque eles não são produzidos como o comentário sugerido por Benjo, mas isso seria um problema em seu aplicativo java, não em bash
.