ECHO comportamento com e sem aspas duplas com hex

0

Alguém pode me ajudar a entender o comportamento de echo ? Eu estou tentando os seguintes comandos no Ubuntu:

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

▒
$

Como você pode ver, com aspas duplas, ao imprimir hexadecimais, a saída é um pouco de lixo. Eu sei que -e pode ser útil para interpretar \n para uma nova linha e outras seqüências. Eu só quero entender como echo com -e opção manipula hexadecimais.

    
por WebEye 30.01.2016 / 04:18

1 resposta

1

Sem as aspas, \x é analisado pelo shell para se tornar apenas x :

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

Veja man bash , seção 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).

Seu grep é enganoso:

$ man echo | grep -o \xHH
xHH

grep -o imprime exatamente os caracteres correspondentes, o que indica que grep nunca recebeu \ .

A menos que você execute /bin/echo ou env echo , o echo incorporado do shell será executado. Portanto, se você quiser verificar a documentação, execute help echo ou procure em man bash . man echo é para /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
...

Veja man bash , seção 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
  
$ printf "%s\n" echo -e \xaa
echo
-e
xaa    
$ printf "%s\n" echo -e "\xaa"
echo
-e
\xaa
nnn 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)
    
por muru 30.01.2016 / 04:26