Por que minha string está mudando neste pipeline?

Por que minha string está mudando neste pipeline?

Eu estava tentando canalizar um URL de saída para o opencomando, mas encontrei vários casos em que, apesar de alterar as configurações de cores do grep ou canalizar a saída adicional por meio de outros utilitários, como awkou, cutainda estava recebendo caracteres especiais na saída. Como mostrado abaixo:

insira a descrição da imagem aqui

Nas duas primeiras vezes que executo o opencomando, recebo dois desses URLs, respectivamente:

insira a descrição da imagem aqui insira a descrição da imagem aqui

Você pode ver os caracteres especiais sendo colados nos URLs, apesar de serem cortados ou alterar as configurações de cores. Isso é confirmado com o odcomando:

➜  ~  apm show vim-mode | grep https | cut -d' ' -f2 | od -atx1
0000000  esc   [   4   m   h   t   t   p   s   :   /   /   g   i   t   h
           1b  5b  34  6d  68  74  74  70  73  3a  2f  2f  67  69  74  68
0000020    u   b   .   c   o   m   /   a   t   o   m   /   v   i   m   -
           75  62  2e  63  6f  6d  2f  61  74  6f  6d  2f  76  69  6d  2d
0000040    m   o   d   e esc   [   2   4   m  nl
           6d  6f  64  65  1b  5b  32  34  6d  0a

 ➜  ~  apm show vim-mode | grep --color=none https | cut -d' ' -f2 | od -atx1
 0000000  esc   [   4   m   h   t   t   p   s   :   /   /   g   i   t   h
            1b  5b  34  6d  68  74  74  70  73  3a  2f  2f  67  69  74  68
 0000020    u   b   .   c   o   m   /   a   t   o   m   /   v   i   m   -
            75  62  2e  63  6f  6d  2f  61  74  6f  6d  2f  76  69  6d  2d
 0000040    m   o   d   e esc   [   2   4   m  nl
            6d  6f  64  65  1b  5b  32  34  6d  0a
 0000052

As próximas duas saídas tentam usar awkpara remover o URL, apmmas também introduzem caracteres especiais e o opencomando tenta abri-los como arquivos. Isto é confirmado com od:

➜  ~  apm show vim-mode | awk -F' ' '/http/ {print $2}' | od -atx1
0000000  esc   [   4   m   h   t   t   p   s   :   /   /   g   i   t   h
           1b  5b  34  6d  68  74  74  70  73  3a  2f  2f  67  69  74  68
0000020    u   b   .   c   o   m   /   a   t   o   m   /   v   i   m   -
           75  62  2e  63  6f  6d  2f  61  74  6f  6d  2f  76  69  6d  2d
0000040    m   o   d   e esc   [   2   4   m  nl
           6d  6f  64  65  1b  5b  32  34  6d  0a

A solução foi usar um lindosed oneliner, sed -r "s/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[m|K]//g"que consegue remover todos os caracteres especiais. O comando final openusa esse oneliner e consegue ir https://github.com/atom/vim-modeconforme o esperado. Isto é confirmado por od:

➜  ~  apm show vim-mode | awk -F' ' '/http/ {print $2}' | sed -r "s/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[m|K]//g" | od -atx1
0000000    h   t   t   p   s   :   /   /   g   i   t   h   u   b   .   c
           68  74  74  70  73  3a  2f  2f  67  69  74  68  75  62  2e  63
0000020    o   m   /   a   t   o   m   /   v   i   m   -   m   o   d   e
           6f  6d  2f  61  74  6f  6d  2f  76  69  6d  2d  6d  6f  64  65
0000040   nl
           0a
0000041

Então isso deixa algumas perguntas:

  1. Por que não está grep --color=nonefuncionando?
  2. Por que meus vários outros utilitários estão adicionando caracteres especiais?

Suspeito que tenha algo a ver com as configurações do meu shell. estou a usarzimcom oidiotatema

editar

a configuração TERM=dumbparece não ter efeito:

➜  github-application master ✓ diff <(TERM=dumb apm show vim-mode | od -atx1) <(apm show vim-mode | od -atx1)
➜  github-application master ✓

a configuração NPM_CONFIG_COLOR=falsetambém parece não ter efeito:

➜  ~/w/s/g/m/todo master ✓ diff <(NPM_CONFIG_COLOR=false apm show vim-mode | od -atx1) <(apm show vim-mode | od -atx1)
➜  ~/w/s/g/m/todo master ✓

Acho que é por causa do sublinhado no URL. Eu tenho explorado isso mais a fundooutra pergunta

Responder1

Parece que os caracteres especiais estão sendo inseridos por apm.

➜  ~  apm show vim-mode | grep https | cut -d' ' -f2 | od -atx1
0000000  esc   [   4   m   h   t   t   p   s   :   /   /   g   i   t   h
           1b  5b  34  6d  68  74  74  70  73  3a  2f  2f  67  69  74  68
0000020    u   b   .   c   o   m   /   a   t   o   m   /   v   i   m   -
           75  62  2e  63  6f  6d  2f  61  74  6f  6d  2f  76  69  6d  2d
0000040    m   o   d   e esc   [   2   4   m  nl
           6d  6f  64  65  1b  5b  32  34  6d  0a

 ➜  ~  apm show vim-mode | grep --color=none https | cut -d' ' -f2 | od -atx1
 0000000  esc   [   4   m   h   t   t   p   s   :   /   /   g   i   t   h
            1b  5b  34  6d  68  74  74  70  73  3a  2f  2f  67  69  74  68
 0000020    u   b   .   c   o   m   /   a   t   o   m   /   v   i   m   -
            75  62  2e  63  6f  6d  2f  61  74  6f  6d  2f  76  69  6d  2d
 0000040    m   o   d   e esc   [   2   4   m  nl
            6d  6f  64  65  1b  5b  32  34  6d  0a
 0000052

➜  ~  apm show vim-mode | od -atx1
0000000  esc   [   3   6   m   v   i   m   -   m   o   d   e esc   [   3
           1b  5b  33  36  6d  76  69  6d  2d  6d  6f  64  65  1b  5b  33
0000020    9   m  nl   �  94  9c   �  94  80   �  94  80  sp esc   [   3
           39  6d  0a  e2  94  9c  e2  94  80  e2  94  80  20  1b  5b  33
0000040    3   m   0   .   6   5   .   1 esc   [   3   9   m  nl   �  94
           33  6d  30  2e  36  35  2e  31  1b  5b  33  39  6d  0a  e2  94
0000060   9c   �  94  80   �  94  80  sp esc   [   4   m   h   t   t   p
           9c  e2  94  80  e2  94  80  20  1b  5b  34  6d  68  74  74  70
0000100    s   :   /   /   g   i   t   h   u   b   .   c   o   m   /   a
           73  3a  2f  2f  67  69  74  68  75  62  2e  63  6f  6d  2f  61
0000120    t   o   m   /   v   i   m   -   m   o   d   e esc   [   2   4
           74  6f  6d  2f  76  69  6d  2d  6d  6f  64  65  1b  5b  32  34
0000140    m  nl   �  94  9c   �  94  80   �  94  80  sp   A   d   d  sp
           6d  0a  e2  94  9c  e2  94  80  e2  94  80  20  41  64  64  20
0000160    v   i   m  sp   m   o   d   a   l  sp   c   o   n   t   r   o
           76  69  6d  20  6d  6f  64  61  6c  20  63  6f  6e  74  72  6f
0000200    l  nl   �  94  9c   �  94  80   �  94  80  sp   5   0   3   8
           6c  0a  e2  94  9c  e2  94  80  e2  94  80  20  35  30  33  38
0000220    6   1  sp   d   o   w   n   l   o   a   d   s  nl   �  94  94
           36  31  20  64  6f  77  6e  6c  6f  61  64  73  0a  e2  94  94
0000240    �  94  80   �  94  80  sp   1   0   1   4  sp   s   t   a   r
           e2  94  80  e2  94  80  20  31  30  31  34  20  73  74  61  72
0000260    s  nl  nl   R   u   n  sp   `   a   p   m  sp   i   n   s   t
           73  0a  0a  52  75  6e  20  60  61  70  6d  20  69  6e  73  74
0000300    a   l   l  sp   v   i   m   -   m   o   d   e   `  sp   t   o
           61  6c  6c  20  76  69  6d  2d  6d  6f  64  65  60  20  74  6f
0000320   sp   i   n   s   t   a   l   l  sp   t   h   i   s  sp   p   a
           20  69  6e  73  74  61  6c  6c  20  74  68  69  73  20  70  61
0000340    c   k   a   g   e   .  nl  nl
           63  6b  61  67  65  2e  0a  0a
0000350

sendo e esc [ 2 4as linhas de interesse específicas.

Isso é confirmado mudando para o bash e obtendo o mesmo resultado:

bash-3.2# apm show vim-mode | grep https | cut -d' ' -f2 | od -atx1
0000000  esc   [   4   m   h   t   t   p   s   :   /   /   g   i   t   h
           1b  5b  34  6d  68  74  74  70  73  3a  2f  2f  67  69  74  68
0000020    u   b   .   c   o   m   /   a   t   o   m   /   v   i   m   -
           75  62  2e  63  6f  6d  2f  61  74  6f  6d  2f  76  69  6d  2d
0000040    m   o   d   e esc   [   2   4   m  nl
           6d  6f  64  65  1b  5b  32  34  6d  0a

Obrigado @muru pela dica!

informação relacionada