Хотя очевидным, стандартным и рекомендуемым решением является использование printf, сделать это echoможет быть довольно сложно в зависимости от реализации (не так сложно, как -nкажется).
POSIX.2017 совместимый echoс
POSIX требует echo -e вывода -e<newline>. Так что это просто
echo -e
там. POSIX-совместимые echoв этом отношении (большинство из них не POSIX-совместимые в других отношениях, спецификация POSIX близка к бесполезной, когда это касается echo) включают в себя:
echoвстроенный в bashкогда оба xpg_echoи posixопции включены (во время выполнения или сборки время , как для /bin/shот Apple MacOS). set -o posix; shopt -s xpg_echo(эта posixопция также может быть включена, если она вызывается как shили когда POSIXLY_CORRECTили SHELLOPTS=posixнаходится в среде).
/bin/echoсертифицированных систем UNIX (AIX, MacOS, Solaris , по крайней мере) , и большинство BSDs
echoвстроенный из dash, ksh88, Борна оболочки, CSH, Tcsh, шикарном, RC, ES, akanga
- GNU
echo( /bin/echoв системах GNU), когда он POSIXLY_CORRECTнаходится в окружающей среде.
echoвстроенный в mkshи некоторые другие pdksh-производный , когда их posixвключена опция.
echoвстроенный из yashкогда $ECHO_STYLEлибо установлен или один из SYSV, XSI, BSD, DASH,RAW
реализации, которые поддерживают -e
Включает в echoисследовательской Unix V8 (где он выходит), GNU, BusyBox, с echoвстроенной командой из bash, zsh, pdkshи их производные, fishнекоторые ash-На оболочки , как BusyBox shили shнекоторых BSDs, последние версии ksh93(на некоторых системах, а также с некоторыми значениями $PATH) с настройками по умолчанию, yashс $ECHO_STYLEодним из GNUили ZSH:
echo -e '-e\n\c'
Реализации, которые поддерживают, -eвсегда поддерживают -n, поэтому:
echo -ne '-e\n'
будет работать так же.
ЗШ
zsh«S echoявляется единственной реализацией , что я знаю , что поддерживает истекший вариант маркеров ( -).
echo - -e
Делая это единственной подобной Борну оболочкой, echoкоторая может выводить произвольные данные (также потому, что она единственная, которая поддерживает байты NUL в своих переменных и аргументах своих встроенных функций) с помощью echo -E - "$data")
За исключением проблемы NUL-байтов, другими реализациями, которые могут выводить произвольные данные, являются FreeBSD или macOS, /bin/echoгде вы можете сделать:
/bin/echo "$data
\c"
(в этой реализации \cраспознается только в конце, и никакая другая escape-последовательность не поддерживается).
И yashs:
ECHO_STYLE=RAW echo "$data"
(хотя обратите внимание, что yashпеременные могут содержать только текст, поэтому не произвольные последовательности байтов в локалях, где не все последовательности байтов могут образовывать допустимые символы, как в тех, которые используют UTF-8 в качестве своей карты символов).
echoобычно встроен в оболочку, но обычно есть и/usr/bin/echo. Это-eне POSIX, но доступно, например, с bash. Пожалуйста, опишите подробнее, что вы имеете в виду под словом «они все еще не работают». Какое поведение ожидается?