Seqüências de escape com "echo -e" em diferentes conchas

20

Acabei de notar que parece que a bandeira -enão existe para o echocomando no meu shell no Linux. É apenas uma configuração confusa ou é "normal"?

Algum código como exemplo:

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

Impressões:

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

Isso funcionou antes! Eu acho que alguns sttycomandos deram muito errado e agora não funciona mais. Alguém sugeriu que o meu shera realmente justo bash.

BrainStone
fonte
Não existe um "shell Linux" . Há, por exemplo, o echobuilt-in do /bin/shshell, conforme fornecido pelo dashpacote no Debian (um sistema operacional que pode ter Linux ou FreeBSD como seu kernel).
Stéphane Chazelas
E é por isso que apenas coloco caracteres de escape no meu roteiro quando preciso deles.

Respostas:

20

Como você usou sh, não bash, o echocomando in shnão tem opção -e. Da 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.

E também não tem \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
fonte
5
Várias shimplementações suportam echo -e, no momento da compilação, bashpode ser dito para não suportar echo -e. É que esse sh em particular (provavelmente dash) não suporta -eenquanto esse em particular obash suporta.
Stéphane Chazelas
17

-enão é POSIX (de fato, o POSIX echo geralmente não aceita opções (embora seja permitido o suporte -n), veja aqui ), e /bin/shno seu sistema parece ser um shell POSIX. -eé uma extensão aceita em algumas conchas, mas você não deve confiar nela, não é portátil. Idealmente, use printfou mude para o uso de um shell que possui echo -e.

Veja também as advertências \enos comentários abaixo, que devem ser substituídas por \033.

printf '\033[3;12r\033[3H'
Chris Down
fonte
3
como o gnouc aponta, shtambém não reconhece \e. Use\033
rici 27/08/13
4

Observe que a qualquer momento e em quase qualquer shell, você pode descobrir qual "eco" será chamado digitando type echoou which echo. Geralmente é um shell embutido. Portanto, depende de qual "eco" está instalado e de qual shell você está usando.

piojo
fonte
4
which echonão deve ser usado, provavelmente não informará se você está usando um built-in, porque whichgeralmente é um binário externo. typeé bom, no entanto.
Chris Baixo
1
Bem descoberto, embora no meu shell principal (zsh), seja um builtin (como revelado por type whichou which which). ;)
piojo 27/08