Подстановка команд ( $ (cmd)
или `cmd`
(также $ {cmd;}
в ksh93)) сохраняет стандартный вывод cmd
минус завершающие символы новой строки (если этот вывод не содержит байтов NUL в оболочках, отличных от zsh
).
С обратной косой чертой ничего особенного не происходит. Единственные символы, с которыми он может ошибаться, - это символ NUL (и каждый символ после первого вхождения NUL в некоторых оболочках) и завершающие символы новой строки.
var=$(printf '%s\n\n\n' 'foo\bar\\baz')
Сохранит foo \ bar \\ baz
в $ var
.
Если вы не видите этих обратных косых черт в $ var
, это может быть связано либо с тем, что вы не проверили их правильность, например с помощью echo
или ] print
, которая интерпретирует escape-последовательности с обратной косой чертой.
Например, в режиме соответствия UNIX bash
echo
дает:
bash-4.3$ echo "$var"
foar\baz
( \ b
был расширен до backspace , который при отправке на терминал заставляет его вернуться на один символ назад).
Вы хотите использовать printf
для вывода произвольных данных (и не забудьте указать свои переменные в кавычках):
bash-4.3$ printf '%s\n' "$var"
foo\bar\\baz
И когда этот вывод поступает на терминал, вы можете хотите обработать его с помощью sed -nl
, чтобы, например, стали видны управляющие символы или символы конечного пробела.
Или это потому, что эти обратные косые черты не выводились на стандартный вывод.Например:
foo() {
printf foo
printf '\\' >&2
printf 'bar\n'
}
При запуске этой функции:
bash-4.3$ foo
foo\bar
bash-4.3$ var=$(foo)
\bash-4.3$ printf '%s\n' "$var"
foobar
\
не попал в $ var
, он был выведен в stderr.
Или, конечно, это может быть потому, что они вообще не выводятся, как предполагает ваш комментарий к ответу Бенджо, но тогда это будет проблемой в вашем Java-приложении, а не в bash
.
Попробуйте
myvariable="$(java -jar MyJavaJarFile.jar)"
И он должен сохранить его как строку, которая должна отображать "\" а также