Secuencias de escape con "echo -e" en diferentes capas

20

Acabo de notar que parece que la bandera -eno existe para el echocomando en mi shell en Linux. ¿Es solo una configuración desordenada o es "normal"?

Algún código como ejemplo:

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

Huellas dactilares:

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

Esto funcionó antes! Supongo que algunos sttycomandos salieron terriblemente mal y ahora ya no funciona. Alguien sugirió que mi shera realmente justo bash.

BrainStone
fuente
No hay tal cosa como un "shell de Linux" . Existe, por ejemplo, la echoconstrucción del /bin/shshell que proporciona el dashpaquete en Debian (un sistema operativo que puede tener Linux o FreeBSD como núcleo).
Stéphane Chazelas
Y es por eso que solo pongo caracteres de escape en mi script cuando los necesito.

Respuestas:

20

Porque usaste sh, no bash, entonces el echocomando shno tiene opción -e. Desde la página de shmanual:

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.

Y tampoco tiene \e:

        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.
Cuonglm
fuente
55
shSoporte de varias implementaciones echo -e, en el momento de la compilación bashse les puede decir que no lo admitan echo -e. Es solo que ese sh particular (probablemente dash) no es compatible -emientras que esebash sí lo hace.
Stéphane Chazelas
17

-eno es POSIX (de hecho, POSIX echo generalmente no acepta opciones (aunque está permitido admitir -n), ver aquí ), y /bin/shen su sistema parece ser un shell POSIX. -ees una extensión aceptada en algunos shells, pero no debe confiar en ella, no es portátil. Idealmente, use printfo cambie a usar un shell que tiene echo -e.

También vea las advertencias de \een los comentarios a continuación, que deben reemplazarse por \033.

printf '\033[3;12r\033[3H'
Chris Down
fuente
3
Como señala Gnouc, shtampoco reconoce \e. Uso\033
rici
4

Tenga en cuenta que en cualquier momento y en casi cualquier shell, puede averiguar qué "eco" se llamará escribiendo type echoo which echo. Suele ser un caparazón incorporado. Por lo tanto, depende de qué "eco" esté instalado y de qué shell esté utilizando.

piojo
fuente
44
which echono debe usarse, es probable que no le diga si está usando un incorporado porque whichgeneralmente es un binario externo. typees bueno, sin embargo.
Chris Down
1
Bien visto, aunque en mi shell principal (zsh), es un incorporado (como lo revela type whicho which which). ;)
piojo