web-dev-qa-db-fra.com

Comportement ECHO avec et sans guillemets doubles avec hex

Quelqu'un peut-il m'aider à comprendre le comportement de echo? J'essaie les commandes suivantes dans Ubuntu:

$ echo -e \xaa
xaa
$ echo -e "\xaa"

▒
$

Comme vous pouvez le constater, avec des guillemets doubles, lors de l’impression d’hexadécimaux, la sortie est un peu moche. Je sais que -e peut être utile pour interpréter \n avec une nouvelle ligne et d’autres séquences. Je veux juste comprendre comment echo avec l'option -e gère les hexadécimaux.

2
WebEye

Sans les guillemets, _\x_ est analysé par le shell pour devenir simplement x:

_$ printf "%s\n" echo -e \xaa
echo
-e
xaa    
$ printf "%s\n" echo -e "\xaa"
echo
-e
\xaa
_

Voir man bash , section QUOTING:

_   A non-quoted backslash (\) is the escape character.  It  preserves  the
   literal value of the next character that follows, with the exception of
   <newline>.  If a \<newline> pair appears,  and  the  backslash  is  not
   itself  quoted,  the \<newline> is treated as a line continuation (that
   is, it is removed from the input stream and effectively ignored).
_

Votre grep est trompeur:

_$ man echo | grep -o \xHH
xHH
_

_grep -o_ imprime exactement les caractères qui correspondent, indiquant que grep n'a jamais reçu le _\_.


Sauf si vous exécutez _/bin/echo_ ou _env echo_, le shell intégré du shell echo sera exécuté. Donc, si vous voulez consulter la documentation, exécutez _help echo_ ou regardez dans _man bash_. _man echo_ est pour _/bin/echo_:

_$ echo --help
--help
$ env echo --help
Usage: echo [SHORT-OPTION]... [STRING]...
  or:  echo LONG-OPTION
Echo the STRING(s) to standard output.

  -n             do not output the trailing newline
  -e             enable interpretation of backslash escapes
  -E             disable interpretation of backslash escapes (default)
      --help     display this help and exit
      --version  output version information and exit

If -e is in effect, the following sequences are recognised:

  \\      backslash
...
_

Voir _man bash_, section _Shell BUITLIN COMMANDS_:

_  echo interprets the following escape sequences:
  \a     alert (bell)
  \b     backspace
  \c     suppress further output
  \e
  \E     an escape character
  \f     form feed
  \n     new line
  \r     carriage return
  \t     horizontal tab
  \v     vertical tab
  \\     backslash
  \0nnn  the eight-bit character whose value is  the  octal  value
         nnn (zero to three octal digits)
  \xHH   the  eight-bit  character  whose value is the hexadecimal
         value HH (one or two hex digits)
_
2
muru