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

20

Je viens de remarquer qu'il semble que le drapeau -en'existe pas pour la echocommande 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 sttycommandes ont terriblement mal tourné et maintenant cela ne fonctionne plus. Quelqu'un a suggéré que mon shétait en fait juste bash.

BrainStone
la source
Il n'y a pas de "shell Linux" . Il y a par exemple la echostructure interne du /bin/shshell fournie par le dashpaquet sur Debian (un système d'exploitation qui peut avoir Linux ou FreeBSD comme noyau).
Stéphane Chazelas
Et c'est pourquoi je mets juste des caractères d'échappement dans mon script quand j'en ai besoin.

Réponses:

20

Parce que vous avez utilisé sh, non bash, la echocommande in shn'a pas d'option -e. Depuis la shpage de manuel:

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 non \eplus:

        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
la source
5
Plusieurs shimplémentations prises en charge echo -e, au moment de la compilation, bashpeuvent être informées de ne pas prendre en charge echo -e. C'est juste que ce sh particulier (probablement dash) ne prend pas en charge -ealors que ce particulier lebash fait.
Stéphane Chazelas
17

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

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

printf '\033[3;12r\033[3H'
Chris Down
la source
3
comme le souligne gnouc, shne le reconnaît pas non \eplus. Utilisation\033
rici
4

Notez qu'à tout moment et dans presque n'importe quel shell, vous pouvez déterminer quel "écho" sera appelé en tapant type echoou which echo. C'est généralement un shell intégré. Cela dépend donc de l '"echo" installé et du shell que vous utilisez.

piojo
la source
4
which echone doit pas être utilisé, il ne vous dira probablement pas si vous utilisez une fonction intégrée, car il whichs'agit généralement d'un binaire externe. typeest bon, cependant.
Chris Down
1
Bien repéré, bien que sur mon shell principal (zsh), c'est un intégré (comme révélé par type whichou which which). ;)
piojo