Почему «эхо» работает как «эхо -е» в моем bash?

Я наткнулся на странную проблему с 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?

Gilles Quénot 18.04.2023 21:23
type echo => echo is a shell builtin
Fravadona 18.04.2023 21:23

Если открыть новую вкладку виртуального терминала, то же самое?

Gilles Quénot 18.04.2023 21:26

Это из прямого сеанса SSH, без мультиплексора

Fravadona 18.04.2023 21:28

Может попросить #[email protected]

Gilles Quénot 18.04.2023 21:30

"Опция оболочки xpg_echo может использоваться для динамического определения того, расширяет ли echo эти escape-символы по умолчанию". . Так что запустите shopt и посмотрите, включена ли она.

nos 18.04.2023 21:33

@nos Я только что выключил его и получил "ожидаемое" a\tb

Fravadona 18.04.2023 21:34

Даже если в подсказке написано bash, вы уверены, что не используете оболочку, подобную zsh, где -e включен по умолчанию?

0stone0 18.04.2023 21:35

@0stone0 нет, моя подсказка выглядела так после ввода bash

Fravadona 18.04.2023 21:36

@nos, вы можете опубликовать shopt -u xpg_echo в качестве ответа, я приму это

Fravadona 18.04.2023 21:37

xpg_echo включен по умолчанию в Solaris задолго до bash 5.1.

oguz ismail 18.04.2023 21:57

@oguzismail Это действительно так. Я не заметил этого с bash 4.x Solaris 11.3/11.4...

Fravadona 18.04.2023 22:01

ага. если я правильно помню, то же самое и на macos, aix, hp-ux и z/os. вот почему printf предпочтительнее

oguz ismail 18.04.2023 22:02

это должно быть на Unix и Linux

phuclv 18.04.2023 23:38

это одна из причин, по которой люди рекомендуют использовать printf вместо echo.

pynexj 19.04.2023 08:52
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
3
15
102
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

У вас включена опция оболочки 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 18.04.2023 21:40

@Fravadona Может быть .bashrc/.bash_profile для вашего пользователя или глобально на той конкретной машине, которая его включает.

nos 19.04.2023 11:21

Поскольку существует множество возможных способов включения параметра xpg_echo, самый безопасный вариант, если вы хотите убедиться, что echo не будет интерпретировать экранирование обратной косой черты, может состоять в том, чтобы всегда использовать параметр -E. Однако код типа

echo -E "$var"

по-прежнему не работает в целом, потому что «$ var» может расширяться до опции echo. Я считаю, что лучше всего использовать echo только для простых литеральных строк, если вообще использовать. Также см. принятый и отличный ответ на вопрос Почему printf лучше, чем echo?.

Другие вопросы по теме