Esci dalle sequenze con "echo -e" in diverse shell


20

Ho appena notato che sembra che la bandiera -enon esista per il echocomando nella mia shell su Linux. È solo un'impostazione incasinata o è "normale"?

Qualche codice come esempio:

#!/bin/sh
echo -e "\e[3;12r\e[3H"

stampe:

-e \e[3;12r\e[3H

Questo ha funzionato prima! Immagino che alcuni sttycomandi siano andati terribilmente male e ora non funziona più. Qualcuno ha suggerito che il mio shera in realtà giusto bash.


Non esiste una "shell Linux" . C'è ad esempio l' echointegrato della /bin/shshell fornito dal dashpacchetto su Debian (un sistema operativo che può avere Linux o FreeBSD come kernel).
Stéphane Chazelas,

Ed è per questo che ho appena inserito personaggi di escape nella mia sceneggiatura quando ne ho bisogno.

Risposte:


20

Perché hai usato sh, no bash, quindi il echocomando in shnon ha opzione -e. Dalla shmanpage:

echo [-n] args...
            Print the arguments on the standard output, separated by spaces.
            Unless the -n option is present, a newline is output following the
            arguments.

E non ha \eanche:

        If any of the following sequences of characters is encountered
        during output, the sequence is not output.  Instead, the specified
        action is performed:

        \b      A backspace character is output.

        \c      Subsequent output is suppressed.  This is normally used at
                the end of the last argument to suppress the trailing new
                line that echo would otherwise output.

        \f      Output a form feed.

        \n      Output a newline character.

        \r      Output a carriage return.

        \t      Output a (horizontal) tab character.

        \v      Output a vertical tab.

        \0digits
                Output the character whose value is given by zero to three
                octal digits.  If there are zero digits, a nul character
                is output.

        \\      Output a backslash.

        All other backslash sequences elicit undefined behaviour.

5
Diverse shimplementazioni supportano echo -e, al momento della compilazione si bashpuò dire di non supportare echo -e. È solo che quel particolare sh (probabilmente dash) non supporta -ementre quel particolare lobash fa.
Stéphane Chazelas,

17

-enon è POSIX (in effetti, POSIX echo generalmente non accetta opzioni (sebbene sia supportato -n), vedi qui ), e /bin/shsul tuo sistema sembra essere una shell POSIX. -eè un'estensione accettata in alcune shell, ma non dovresti fare affidamento su di essa, non è portatile. Idealmente, utilizzare printfo passare a utilizzare una shell che ha echo -e.

Vedi anche le avvertenze di \enei commenti qui sotto, che dovrebbero essere sostituite con \033.

printf '\033[3;12r\033[3H'

3
come sottolinea gnouc, shnon lo riconosce \eneanche. Usa\033
rici il

4

Si noti che in qualsiasi momento e in quasi ogni shell, è possibile capire quale "eco" verrà chiamato digitando type echoo which echo. Di solito è una shell incorporata. Quindi dipende da quale "eco" è installato e da quale shell si sta utilizzando.


4
which echonon dovrebbe essere usato, probabilmente non ti dirà se stai usando un builtin perché di whichsolito è un binario esterno. typeè buono, però.
Chris Down,

1
Ben individuato, anche se sulla mia shell principale (zsh), è incorporato (come rivelato da type whicho which which). ;)
piojo,
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.