Escape de seqüências com "echo -e" em diferentes shells

17

Acabei de notar que parece que o sinalizador -e não existe para o comando echo no meu shell no Linux. Isso é 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 comandos stty deram muito errado e agora não funciona mais. Alguém sugeriu que meu sh era na verdade apenas bash .

    
por BrainStone 27.08.2013 / 03:58

3 respostas

17

Como você usou sh , não bash , o comando echo em sh não tem a opção -e . De sh manpage:

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.

        
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.
digits 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.
    
por 27.08.2013 / 04:31
15

-e não é POSIX (na verdade, o POSIX echo geralmente não aceita opções (embora seja permitido suportar -n ), veja aqui ), e /bin/sh no seu sistema parece ser um shell POSIX. -e é uma extensão aceita em alguns shells, mas você não deve confiar nela, não é portátil. Idealmente, use printf ou mude para usando um shell que tenha echo -e .

Veja também as advertências de \e nos comentários abaixo, que devem ser substituídos por 3 .

printf '3[3;12r3[3H'
    
por 27.08.2013 / 04:28
3

Note que a qualquer momento e em quase qualquer shell, você pode descobrir qual "echo" será chamado digitando type echo ou which echo . Geralmente é um shell embutido. Então, depende de qual "echo" está instalado e em qual shell você está usando.

    
por 27.08.2013 / 11:52