Estaba intentando canalizar una URL de salida en el open
comando, pero encontré varios casos en los que, a pesar de cambiar la configuración de color de grep o canalizar más salida a través de otras utilidades como awk
o, cut
todavía obtenía caracteres especiales en la salida. Como se muestra abajo:
Las primeras 2 veces que ejecuto el open
comando me envían dos de estas dos URL respectivamente:
Puede ver los caracteres especiales que se agregan a las URL a pesar de haber sido cortados o cambiados la configuración de color. Esto se confirma con el 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
Las siguientes dos salidas intentan usar awk
para eliminar la URL, apm
sin embargo, también introducen caracteres especiales y el open
comando luego intenta abrirlos como archivos. Esto se confirma con 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
La solución ha sido utilizar una preciosased oneliner, sed -r "s/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[m|K]//g"
que logra eliminar todos los caracteres especiales. El comando final open
utiliza este oneliner y logra llegar a https://github.com/atom/vim-mode
lo esperado. Esto lo confirma 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
Entonces esto deja algunas preguntas:
- ¿Por qué no funciona
grep --color=none
? - ¿Por qué mis otras utilidades añaden caracteres especiales?
Sospecho que tiene algo que ver con la configuración de mi shell. Estoy usandozimcon elgistertema
editar
La configuración TERM=dumb
parece no tener ningún efecto:
➜ github-application master ✓ diff <(TERM=dumb apm show vim-mode | od -atx1) <(apm show vim-mode | od -atx1)
➜ github-application master ✓
La configuración NPM_CONFIG_COLOR=false
tampoco parece tener ningún efecto:
➜ ~/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 ✓
Creo que es por el subrayado en la URL. Lo he estado explorando más a fondo enotra pregunta
Respuesta1
Parece que los caracteres especiales están siendo insertados 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
siendo e esc [ 2 4
las líneas de interés específicas.
Esto se confirma cambiando a bash y obteniendo el mismo 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
¡Gracias @muru por el consejo!