Agregue automáticamente nueva línea al final del cuerpo de respuesta de curvatura

234

Si el cuerpo de respuesta HTTP para una solicitud de curl no contiene una nueva línea final, termino con esta condición realmente molesta en la que el indicador de comandos de shell está en el medio de la línea, y escapar es lo suficientemente desordenado como cuando puse el último curl comando en la pantalla, al eliminar caracteres de ese comando curl, elimine los caracteres incorrectos.

Por ejemplo:

[root@localhost ~]# curl jsonip.com
{"ip":"10.10.10.10","about":"/about"}[root@localhost ~]#

¿Hay algún truco que pueda usar para agregar automáticamente una nueva línea al final de una respuesta en curva, para que el mensaje vuelva al borde izquierdo de la pantalla?

Kevin Burke
fuente
Ninguna de estas respuestas funciona para mí con cualquier versión de curl que tenga mi instalación cygwin; solo envolver todo el comando curl en una declaración echo hace, por ejemplo echo "$(curl localhost:8001/api)", esta respuesta: unix.stackexchange.com/a/217611/110338
Alex Hall

Respuestas:

418

Del archivo man:

Para permitir que los programadores de scripts conozcan mejor el progreso de curl, se introdujo la opción de escritura -w / -. Con esto, puede especificar qué información de la transferencia anterior desea extraer.

Para mostrar la cantidad de bytes descargados junto con algo de texto y una nueva línea final:

curl -w 'We downloaded %{size_download} bytes\n' www.download.com

Intente agregar lo siguiente a su ~/.curlrcarchivo:

-w "\n"
David J.
fuente
46
Puede ejecutar el siguiente comando que lo hace por usted:echo '-w "\n"' >> ~/.curlrc
tbraun
55
¡Siempre agrego -w "\n"manualmente a cada comando de curl y TIL ~/.curlrcexiste!
Zhuoyun Wei
2
Esto puede no funcionar bajo git-bash en Windows; Agregué -w "\nKLJLJKLJ LJKLLKJ"a mi ~/.curlrcy corrí un rizo y no obtuve una nueva línea ni los personajes extraños.
jcollum
@jcollum Algunos puertos de Windows prefieren _sobre .. Es probable que su rizo esté buscando ~/_curlrcy, en consecuencia echo '-w "\n"' >> ~/_curlrc, probablemente funcionará. Lo hace por mi. por cierto: curl se quejará por espacios en blanco sin escape
user1129682
Hay valor en usar la línea de comando con -w "\n"o agregar ; echosobre la modificación de su .curlrc. Si modifica su curlrc, algunos scripts pueden romperse si no manejan una nueva línea al final de los datos de respuesta. Personalmente, me quedaría con las adiciones en la línea de comando para modificar el rc.
Jason
99

Trata eso :

curl jsonip.com; echo 

SALIDA

{"ip":"x.x.x.x","about":"/about"}

Esto es así de simple;)

(y no se limita al comando curl, sino a todos los comandos que no terminan con una nueva línea)

Gilles Quenot
fuente
3
¿Hay alguna manera de envolver esto en un script o alias bash o algo similar? Escribir "; echo" al final de cada línea puede ser tedioso, y siento que esto debería ser automatizado de alguna manera.
Matthew G
En SO, es mejor proporcionar un esfuerzo de búsqueda. Encontrar cómo poner esto en un alias o script es obvio.
Gilles Quenot
2
Observe que al agregar el comando echo se borra el código de salida del comando curl. La opción -w "\ n" para curl sugerida en la respuesta más popular mantiene el código de salida curl disponible para inspección.
bradoaks
14

Para obtener más información, así como una nueva línea limpia después del rizo

~/.curlrc

-w "\nstatus=%{http_code} %{redirect_url} size=%{size_download} time=%{time_total} content-type=\"%{content_type}\"\n"

(Más opciones están disponibles aquí )

redirect_urlestará en blanco si la solicitud no se redirige o si utiliza -Lpara seguir la redirección.

Salida de ejemplo:

~ ➤  curl https://www.google.com
<HTML><HEAD><meta http-equiv="content-type" content="text/html;charset=utf-8">
<TITLE>302 Moved</TITLE></HEAD><BODY>
<H1>302 Moved</H1>
The document has moved
<A HREF="https://www.google.co.uk/?gfe_rd=cr&amp;ei=FW">here</A>.
</BODY></HTML>

status=302 https://www.google.co.uk/?gfe_rd=cr&ei=FW size=262 time=0.044209 content-type="text/html; charset=UTF-8"
~ ➤  

Editar , para que las cosas sean más legibles, puede agregar colores ANSI a la -wlínea, no es tan fácil escribir directamente, pero este script puede generar un ~/.curlrcarchivo con colores.

#!/usr/bin/env python3
from pathlib import Path
import click
chunks = [
    ('status=', 'blue'),
    ('%{http_code} ', 'green'),
    ('%{redirect_url} ', 'green'),
    ('size=', 'blue'),
    ('%{size_download} ', 'green'),
    ('time=', 'blue'),
    ('%{time_total} ', 'green'),
    ('content-type=', 'blue'),
    ('\\"%{content_type}\\"', 'green'),
]
content = '-w "\\n'
for chunk, colour in chunks:
    content += click.style(chunk, fg=colour)
content += '\\n"\n'

path = (Path.home() / '.curlrc').resolve()
print('writing:\n{}to: {}'.format(content, path))
path.write_text(content)
SColvin
fuente
1

La solución general para bash es agregar un símbolo de nueva línea en el símbolo del sistema:

Vea la pregunta relacionada ( ¿Cómo tener una nueva línea antes de bash prompt? ) Y la respuesta correspondiente

Esta solución cubre cada comando, no solo curl.

echo $PS1 # To get your current PS1 env variable's value aka '_current_PS1_'
PS1='\n_current_PS1_'

El único efecto secundario es que obtienes el símbolo del sistema después de cada segunda línea.

Dionio
fuente