web-dev-qa-db-fra.com

Séquences d'échappement avec "echo -e" dans différents shells

Je viens de remarquer qu'il semble que le drapeau -e n'existe pas pour la commande echo dans mon shell sous Linux. Est-ce juste un paramètre foiré ou est-ce "normal"?

Du code comme exemple:

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

Tirages:

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

Cela fonctionnait avant! Je suppose que certaines commandes stty se sont terriblement mal passées et maintenant cela ne fonctionne plus. Quelqu'un a suggéré que mon sh n'était en fait que bash.

21
BrainStone

Parce que vous avez utilisé sh, pas bash, alors la commande echo dans sh n'a pas d'option -e. Depuis la page de manuel de sh:

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.

Et il n'a pas \e, aussi:

        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.
22
cuonglm

-e n'est pas POSIX (en fait, l'écho POSIX n'accepte généralement aucune option (bien qu'il soit autorisé à prendre en charge -n), voir ici ) et /bin/sh sur votre système semble être un shell POSIX. -e est une extension acceptée dans certains shells, mais vous ne devriez pas vous y fier, elle n'est pas portable. Idéalement, utilisez printf, ou passez à l'utilisation d'un shell qui a echo -e.

Voir également les mises en garde de \e dans les commentaires ci-dessous, qui devraient être remplacés par \033.

printf '\033[3;12r\033[3H'
18
Chris Down

Notez qu'à tout moment et dans presque tous les Shell, vous pouvez déterminer quel "écho" sera appelé en tapant type echo ou which echo. Il s'agit généralement d'un shell intégré. Cela dépend donc de l '"écho" installé et du shell que vous utilisez.

4
piojo