Mentre la soluzione ovvia, standard e raccomandata è di usare printf
, farlo con echo
può essere abbastanza complicato a seconda dell'implementazione (non così complicato come -n
se).
Conformità POSIX.2017 echo
s
POSIX richiede echo -e
l'output -e<newline>
. Quindi è giusto
echo -e
Là. Le norme POSIX echo
a tale riguardo (la maggior parte di esse non è conforme a POSIX per altri aspetti, le specifiche POSIX sono quasi inutili quando si tratta di echo
) includono:
- l'
echo
integrato di bash
quando entrambe le opzioni xpg_echo
e posix
sono state abilitate (in fase di runtime o di costruzione come per /bin/sh
Apple macOS). set -o posix; shopt -s xpg_echo
(l' posix
opzione può anche essere abilitata se invocata come sh
o quando POSIXLY_CORRECT
o SHELLOPTS=posix
è nell'ambiente).
- la
/bin/echo
dei sistemi certificati UNIX (AIX, MacOS, Solaris almeno) e la maggior parte BSD
- il
echo
builtin di dash
, ksh88
la shell Bourne, csh, tcsh, elegante, rc, es, akanga
- GNU
echo
( /bin/echo
su sistemi GNU) quando si POSIXLY_CORRECT
trova nell'ambiente.
- il
echo
builtin di mksh
e qualche altro pdksh-deriva quando la loro posix
opzione è abilitata.
- la
echo
builtin di yash
quando $ECHO_STYLE
è o disinserito o uno SYSV
, XSI
, BSD
, DASH
,RAW
implementazioni che supportano -e
Comprende echo
la ricerca Unix V8 (da dove proviene), GNU, busybox, il echo
builtin di bash
, zsh
, pdksh
e derivati, fish
alcune ash
conchiglie basati su come busybox sh
o sh
di alcuni BSD, le versioni recenti di ksh93
(su alcuni sistemi, e con alcuni valori di $PATH
) con le loro impostazioni predefinite, yash
con $ECHO_STYLE
uno di GNU
o ZSH
:
echo -e '-e\n\c'
Le implementazioni che supportano -e
invariabilmente supportano -n
, quindi:
echo -ne '-e\n'
funzionerebbe pure.
zsh
zsh
Questa echo
è l'unica implementazione che conosco che supporta un marker di fine opzione ( -
).
echo - -e
Rendendolo l'unica shell tipo Bourne echo
che può generare dati arbitrari (anche perché è l'unico che supporta byte NUL nelle sue variabili e gli argomenti dei suoi builtin) con echo -E - "$data"
)
Fatta eccezione per il problema del byte NUL, altre implementazioni che possono generare dati arbitrari sono FreeBSD o macOS /bin/echo
dove puoi fare:
/bin/echo "$data
\c"
(in tale implementazione, \c
viene riconosciuto solo alla fine e non è supportata alcuna altra sequenza di escape).
E yash
':
ECHO_STYLE=RAW echo "$data"
(sebbene si noti che le yash
variabili possono contenere solo testo, quindi non sequenze di byte arbitrarie in locali in cui non tutte le sequenze di byte possono formare caratteri validi come quelli che usano UTF-8 come loro charmap).
echo
è di solito una shell incorporata, ma di solito c'è anche/usr/bin/echo
. Non-e
è POSIX, ma disponibile ad es. Con bash. Fornisci maggiori dettagli su cosa intendi con "non funzionano ancora". Qual è il comportamento previsto?