Come faccio a stampare '-e' con eco?


8

So che echo -enon è un comando normale. Ho provato echo '-e'e echo \-ema ancora non funzionano.


1
Cosa intendi con "non una normale riga di comando"? 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?
maxschlepzig,

Voglio stampare -e usando l'eco. Eventuali suggerimenti?
Highlights Fabbrica

3
considera l'utilizzo di printf, è più portatile.
Michael Durrant,

1
Curiosamente, echo -- -enon funziona neanche. Convenzionalmente (almeno con le utility GNU) il doppio trattino indica la fine delle opzioni, mentre il resto viene mantenuto come argomento letterale.
Wil Cooley,

6
echodi nuovo follia. Se le persone usassero printfe non guardassero mai indietro.
Jens,

Risposte:


9
  • con newline

    echo -en '-e\n'
  • senza newline

    echo -e '-e\c'
  • con spazi intorno:

    echo '-e '
    echo ' -e'
  • usando backspace (grazie a Joseph R.):

    echo -e ' \b-e'

    (produce SPC BS - e LF, ma quando viene inviato a un terminale che viene visualizzato -ementre BS sposta il cursore indietro di una colonna a sinistra causando la -sovrascrittura dell'SPC)

Il comportamento di bash's echoincorporato può dipendere dalla versione bash. Dipende anche l'ambiente ( POSIXLY_CORRECT, SHELLOPTSe BASHOPTSvariabili), le opzioni ( posix, xpg_echo), le opzioni di generazione e argv[0]( shvs bash). Qui testato con GNU bash 4.2.53(1), build predefinita, opzioni predefinite, ambiente vuoto, invocato come bash. Funziona anche con zsh 5.0.5.


+1 Ancheecho -e 'x\b-e'
Joseph R.

2
Perché questi "workaround" offuscati brutti fino all'osso ricevono voti? Charles Duffy di seguito ha la risposta corretta: usa printf e dimentica questi problemi una volta per tutte.
Jens,

7
Jens: perché l'OP ha chiesto come farlo con il echocomando. Atteggiamento non necessario.
ctc,

1
echo -e ' \b-e'genera spazio-backspace-dash-e. Visualizzato solo in un terminale ti darà l'illusione di trattarsi di un trattino.
Stéphane Chazelas,

1
@CharlesDuffy, genera echo -e "\0-e"output NUL-dash-e. E 'solo che i terminali ignorano quel carattere NUL (NULs anche usati da inviare ad alcuni terminali (che non supportano il controllo di flusso) per dare loro il tempo di fare altre cose lunghe come un ritorno a capo. Vedere la sezione sotto Ritardi e imbottitura in terminfo(5).)
Stéphane Chazelas,

25

La soluzione migliore non è usare echo, ma usare printfinvece.

printf '%s\n' -e

Funziona con variabili arbitrarie:

var=-e
printf '%s\n' "$var"

... il che significa che non è necessario eseguire alcuna preparazione / modifica speciale altrove nel codice in base alla consapevolezza che un valore sarà echod.


Per inciso, la specifica del comando shell POSIX perecho riconosce che non è portabile come implementato e contiene una nota sull'argomento:

Non è possibile usare l'eco in modo portabile su tutti i sistemi POSIX a meno che non vengano omesse sia -n (come primo argomento) sia sequenze di escape.

L'utilità printf può essere utilizzata in modo portabile per emulare qualsiasi comportamento tradizionale dell'utilità echo come segue (supponendo che IFS abbia il suo valore standard o sia non impostato):

L'eco storica di System V e i requisiti sulle implementazioni XSI in questo volume di POSIX.1-2008 sono equivalenti a:

printf "%b\n" "$*"

L'eco BSD è equivalente a:

if [ "X$1" = "X-n" ]
then
    shift
    printf "%s" "$*"
else
    printf "%s\n" "$*"
fi

Le nuove applicazioni sono incoraggiate a utilizzare printf anziché echo.

(Enfasi aggiunta).


Detto questo, sui sistemi GNU esiste un'alternativa: richiedere un comportamento conforme agli standard.

$ POSIXLY_CORRECT=1 /bin/echo -e
-e

È interessante notare che la nota POSIX afferma che echo -eè portatile. Dice che -ndeve essere evitato e le sequenze di escape devono essere evitate. echo -eevita entrambi. Ma come indicato nell'ultima parte della risposta, sui sistemi GNU, echonon si preoccupa di conformarsi a POSIX per impostazione predefinita, e POSIX rileva solo la portabilità attraverso i sistemi POSIX.
hvd,

@hvd, non vedo -ecoperto nella parte delle specifiche che ho collegato. Potresti fornire un link o una citazione che lo copre?
Charles Duffy,

È la mancanza di una menzione che lo dice. :) Elenca gli usi che non sono portatili e -enon è menzionato, quindi -eè portatile (di nuovo, attraverso i sistemi POSIX). Per essere onesti, ciò che hai citato è informativo, ma il testo normativo dice la stessa cosa: "Se il primo operando è -n, o se uno degli operandi contiene un carattere <slash>, i risultati sono definiti dall'implementazione."
hvd,

2
@hvd, al contrario. Per funzionare come specificato, echodeve emettere tutti gli argomenti senza alcun comportamento definito in modo contrario dallo standard. Pertanto, a differenza di quasi tutti gli altri strumenti da riga di comando coperti dalle specifiche POSIX, in echorealtà specifica il comportamento per gli argomenti non forniti: Stampa. Non c'è spazio per l'aggiunta di nuove bandiere senza infrangere le specifiche.
Charles Duffy,

2
@hvd, ... se è per questo, vedere la OPTIONSsezione in cui è ambientato in bianco e nero: Implementations shall not support any options.
Charles Duffy,

9

Con GNU echo's -econ i codici ASCII per i caratteri:

$ /bin/echo -e '\055'e
-e

055è il numero ASCII ottale per -(vedi man asciiper riferimento rapido).


1
/bin/echoè infatti specificato da POSIX. Tuttavia, la sua interpretazione delle sequenze di escape ottali è un'estensione XSI alla specifica di base.
Charles Duffy,

@CharlesDuffy Effettivamente, ho sbagliato a scrivere. +1 per printf (anche il mio primo pensiero). Dato che si -etratta di un'estensione, tuttavia, esiste un modo per forzare il comportamento POSIX puro echo? Ciò eliminerebbe ogni incertezza su questo, credo.
muru,

2
Attualmente si! L'esportazione POSIXLY_CORRECT=1comporterà un comportamento conforme a POSIX per GNU /bin/echo.
Charles Duffy,

+1 Grazie, buono a sapersi per mantenere i tuoi script portatili e "homebrew-Linux-indipendenti" (ovvero anche lavorare su una workstation professionale al lavoro).
syntaxerror,

@Kusalananda se ne è dimenticato.
muru,

3

Mentre la soluzione ovvia, standard e raccomandata è di usare printf, farlo con echopuò essere abbastanza complicato a seconda dell'implementazione (non così complicato come -nse).

Conformità POSIX.2017 echos

POSIX richiede echo -e l'output -e<newline>. Quindi è giusto

echo -e

Là. Le norme POSIX echoa 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' echointegrato di bashquando entrambe le opzioni xpg_echoe posixsono state abilitate (in fase di runtime o di costruzione come per /bin/shApple macOS). set -o posix; shopt -s xpg_echo(l' posixopzione può anche essere abilitata se invocata come sho quando POSIXLY_CORRECTo SHELLOPTS=posixè nell'ambiente).
  • la /bin/echodei sistemi certificati UNIX (AIX, MacOS, Solaris almeno) e la maggior parte BSD
  • il echobuiltin di dash, ksh88la shell Bourne, csh, tcsh, elegante, rc, es, akanga
  • GNU echo( /bin/echosu sistemi GNU) quando si POSIXLY_CORRECTtrova nell'ambiente.
  • il echobuiltin di mkshe qualche altro pdksh-deriva quando la loro posixopzione è abilitata.
  • la echobuiltin di yashquando $ECHO_STYLEè o disinserito o uno SYSV, XSI, BSD, DASH,RAW

implementazioni che supportano -e

Comprende echola ricerca Unix V8 (da dove proviene), GNU, busybox, il echobuiltin di bash, zsh, pdkshe derivati, fishalcune ashconchiglie basati su come busybox sho shdi alcuni BSD, le versioni recenti di ksh93(su alcuni sistemi, e con alcuni valori di $PATH) con le loro impostazioni predefinite, yashcon $ECHO_STYLEuno di GNUo ZSH:

echo -e '-e\n\c'

Le implementazioni che supportano -einvariabilmente supportano -n, quindi:

echo -ne '-e\n'

funzionerebbe pure.

zsh

zshQuesta echoè l'unica implementazione che conosco che supporta un marker di fine opzione ( -).

echo - -e

Rendendolo l'unica shell tipo Bourne echoche 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/echodove puoi fare:

/bin/echo "$data
\c"

(in tale implementazione, \cviene riconosciuto solo alla fine e non è supportata alcuna altra sequenza di escape).

E yash':

ECHO_STYLE=RAW echo "$data"

(sebbene si noti che le yashvariabili 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).


2

Utilizzare -nper evitare newline:

$ echo -n - && echo e
-e

Ciò non funzionerà zshdove si -trova la fine del delimitatore di opzioni o su tutte le echoimplementazioni che non supportano -n(anche quelle che supportano -esupportano -ncomunque)
Stéphane Chazelas,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.