Bien que la solution évidente, standard et recommandée soit à utiliser printf
, le faire avec echo
peut être assez délicat en fonction de l'implémentation (pas aussi délicat que pour-n
).
Conforme à POSIX.2017 echo
s
POSIX nécessite echo -e
une sortie -e<newline>
. Donc c'est juste
echo -e
Là. Les POSIX conformes echo
à cet égard (la plupart d'entre eux ne sont pas conformes à POSIX à d'autres égards, la spécification POSIX est presque inutile en ce qui concerne echo
):
- la fonction
echo
intégrée bash
lorsque les options xpg_echo
et posix
sont activées (au moment de l'exécution ou de la construction, comme pour /bin/sh
Apple macOS). set -o posix; shopt -s xpg_echo
(l' posix
option peut également être activée si elle est invoquée en tant que sh
ou quand POSIXLY_CORRECT
ouSHELLOPTS=posix
dans l'environnement).
- le
/bin/echo
systèmes UNIX certifiés (AIX, MacOS, Solaris au moins) et la plupart des BSDs
- la
echo
construction de dash
,ksh88
le shell Bourne, csh, tcsh, chic, rc, es, akanga
- GNU
echo
( /bin/echo
sur les systèmes GNU) lorsquePOSIXLY_CORRECT
est dans l'environnement.
- la commande
echo
intégrée mksh
et certains autres dérivés de pdksh lorsque leur posix
option est activée.
- la
echo
commande interne de yash
quand $ECHO_STYLE
est soit inexistant ou l' un de SYSV
, XSI
, BSD
, DASH
,RAW
implémentations qui prennent en charge -e
Comprend echo
de la recherche V8 Unix (où il vient), GNU, busybox, le echo
builtin de bash
, zsh
, pdksh
et ses dérivés, fish
certains ash
coquillages comme à base busybox sh
ou sh
de quelques BSDs, les versions récentes de ksh93
(sur certains systèmes, et avec des valeurs de $PATH
) avec leurs paramètres par défaut, yash
avec l' $ECHO_STYLE
un GNU
ou ZSH
:
echo -e '-e\n\c'
Les implémentations qui prennent en -e
charge prennent toujours en charge -n
, donc:
echo -ne '-e\n'
fonctionnerait aussi bien.
zsh
zsh
« s echo
est la seule mise en œuvre que je sais que les supports d' un marqueur de fin de l' option ( -
).
echo - -e
Ce qui en fait le seul shell de type Bourne echo
capable de produire des données arbitraires (également parce que c'est le seul qui prend en charge les octets NUL dans ses variables et les arguments de ses commandes) avececho -E - "$data"
)
À l'exception du problème d'octets NUL, les autres implémentations qui peuvent générer des données arbitraires sont FreeBSD ou macOS /bin/echo
où vous pouvez faire:
/bin/echo "$data
\c"
(dans cette mise en œuvre, \c
n'est reconnu qu'à la fin, et aucune autre séquence d'échappement n'est prise en charge).
Et c'est yash
:
ECHO_STYLE=RAW echo "$data"
(mais notez que les yash
variables ne peuvent contenir que du texte, donc pas de séquences d'octets arbitraires dans les locales où toutes les séquences d'octets ne peuvent pas former des caractères valides comme dans ceux utilisant UTF-8 comme leur charmap).
echo
est généralement un shell intégré, mais il y en a généralement aussi/usr/bin/echo
. Le-e
n'est pas POSIX, mais disponible par exemple avec bash. Veuillez donner plus de détails sur ce que vous entendez par «ils ne fonctionnent toujours pas». Quel est le comportement attendu?