Eu estava tentando canalizar um URL de saída para o open
comando, 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 awk
ou, cut
ainda estava recebendo caracteres especiais na saída. Como mostrado abaixo:
Nas duas primeiras vezes que executo o open
comando, recebo dois desses URLs, respectivamente:
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 od
comando:
➜ ~ 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 awk
para remover o URL, apm
mas também introduzem caracteres especiais e o open
comando 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 open
usa esse oneliner e consegue ir https://github.com/atom/vim-mode
conforme 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:
- Por que não está
grep --color=none
funcionando? - 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=dumb
parece 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=false
també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 4
as 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!