Хотя очевидным, стандартным и рекомендуемым решением является использование 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-последовательность не поддерживается).
И yash
s:
ECHO_STYLE=RAW echo "$data"
(хотя обратите внимание, что yash
переменные могут содержать только текст, поэтому не произвольные последовательности байтов в локалях, где не все последовательности байтов могут образовывать допустимые символы, как в тех, которые используют UTF-8 в качестве своей карты символов).
echo
обычно встроен в оболочку, но обычно есть и/usr/bin/echo
. Это-e
не POSIX, но доступно, например, с bash. Пожалуйста, опишите подробнее, что вы имеете в виду под словом «они все еще не работают». Какое поведение ожидается?