Я наткнулся на странную проблему с echo
на GNU bash, version 5.1.12(1)-release (x86_64-pc-solaris2.11)
:
bash-5.1$ builtin echo -e 'a\tb'
a b
bash-5.1$ builtin echo 'a\tb'
a b
bash-5.1$ builtin echo +e 'a\tb'
+e a b
Хотя это не повлияет на мои скрипты, потому что я в основном использую printf
, как отключить echo -e
в bash?
type echo
=> echo is a shell builtin
Если открыть новую вкладку виртуального терминала, то же самое?
Это из прямого сеанса SSH, без мультиплексора
Может попросить #[email protected]
"Опция оболочки xpg_echo может использоваться для динамического определения того, расширяет ли echo эти escape-символы по умолчанию". . Так что запустите shopt
и посмотрите, включена ли она.
@nos Я только что выключил его и получил "ожидаемое" a\tb
Даже если в подсказке написано bash, вы уверены, что не используете оболочку, подобную zsh
, где -e
включен по умолчанию?
@0stone0 нет, моя подсказка выглядела так после ввода bash
@nos, вы можете опубликовать shopt -u xpg_echo
в качестве ответа, я приму это
xpg_echo включен по умолчанию в Solaris задолго до bash 5.1.
@oguzismail Это действительно так. Я не заметил этого с bash 4.x Solaris 11.3/11.4...
ага. если я правильно помню, то же самое и на macos, aix, hp-ux и z/os. вот почему printf предпочтительнее
это должно быть на Unix и Linux
это одна из причин, по которой люди рекомендуют использовать printf
вместо echo
.
У вас включена опция оболочки xpg_echo
.
Перечислите параметры, запустив shopt
Отключите его с помощью shopt -u xpg_echo
Чтобы понять это, прочитайте раздел эха man builtins
(при условии, что он дает вам встроенные команды bash, в противном случае посмотрите https://www.gnu.org/software/bash/manual/html_node/Bash-Builtins.html )
Соответствующая часть
Параметр оболочки xpg_echo может использоваться для динамического определения того, или не echo расширяет эти escape-символы по умолчанию.
Это правда, что это старая опция (она есть в bash 3.2), но я впервые включил ее по умолчанию...
@Fravadona Может быть .bashrc/.bash_profile для вашего пользователя или глобально на той конкретной машине, которая его включает.
Поскольку существует множество возможных способов включения параметра xpg_echo
, самый безопасный вариант, если вы хотите убедиться, что echo
не будет интерпретировать экранирование обратной косой черты, может состоять в том, чтобы всегда использовать параметр -E
. Однако код типа
echo -E "$var"
по-прежнему не работает в целом, потому что «$ var» может расширяться до опции echo
. Я считаю, что лучше всего использовать echo
только для простых литеральных строк, если вообще использовать. Также см. принятый и отличный ответ на вопрос Почему printf лучше, чем echo?.
Каков результат
type echo
?