Ajouter automatiquement une nouvelle ligne à la fin du corps de réponse à la boucle

234

Si le corps de réponse HTTP pour une demande de boucle ne contient pas de nouvelle ligne de fin, je me retrouve avec cette condition vraiment ennuyeuse où l'invite du shell est au milieu de la ligne, et l'échappement est suffisamment gâché que lorsque je mets la dernière boucle à l'écran, en supprimant les caractères de cette commande curl, supprimez les mauvais caractères.

Par exemple:

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

Y a-t-il une astuce que je peux utiliser pour ajouter automatiquement une nouvelle ligne à la fin d'une réponse curl, pour ramener l'invite sur le bord gauche de l'écran?

Kevin Burke
la source
Aucune de ces réponses ne fonctionne pour moi quelle que soit la version de curl de mon installation cygwin; le fait d'encapsuler uniquement la commande curl entière dans une instruction echo permet, par exemple echo "$(curl localhost:8001/api)", de répondre à cette réponse: unix.stackexchange.com/a/217611/110338
Alex Hall

Réponses:

418

Depuis le fichier man:

Pour permettre aux programmeurs de scripts de mieux connaître la progression de curl, l'option d'écriture -w / - a été introduite. En utilisant cela, vous pouvez spécifier les informations du transfert précédent que vous souhaitez extraire.

Pour afficher le nombre d'octets téléchargés avec du texte et une nouvelle ligne de fin:

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

Essayez donc d'ajouter ce qui suit à votre ~/.curlrcfichier:

-w "\n"
David J.
la source
46
Vous pouvez exécuter la commande suivante qui fait cela pour vous:echo '-w "\n"' >> ~/.curlrc
tbraun
5
J'ajoute toujours -w "\n"manuellement à chaque commande curl et TIL ~/.curlrcexiste!
Zhuoyun Wei
2
cela peut ne pas fonctionner sous git-bash sous Windows; J'ai ajouté -w "\nKLJLJKLJ LJKLLKJ"à mon ~/.curlrcet j'ai couru une boucle et je n'ai obtenu ni nouvelle ligne ni caractères étranges.
jcollum
@jcollum Certains ports de Windows préfèrent _plus .. Il y a des chances que votre boucle recherche ~/_curlrcet, par conséquent echo '-w "\n"' >> ~/_curlrc, fonctionnera probablement. Ça fait pour moi. btw: curl se plaindra des espaces non
échappés
Il est utile d'utiliser la ligne de commande avec -w "\n"ou d'ajouter au- ; echodessus de la modification de votre .curlrc. Si vous modifiez votre curlrc, certains scripts peuvent se casser s'ils ne gèrent pas une nouvelle ligne à la fin des données de réponse. Personnellement, je m'en tiendrai aux ajouts sur la ligne de commande plutôt que de modifier le rc.
Jason
99

Essayez ça:

curl jsonip.com; echo 

PRODUCTION

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

C'est aussi simple que cela ;)

(et non limité à la commande curl mais toutes les commandes qui ne se terminent pas par une nouvelle ligne)

Gilles Quenot
la source
3
Existe-t-il un moyen d'envelopper cela dans un script ou un alias bash ou quelque chose de similaire? Taper "; echo" à la fin de chaque ligne peut devenir fastidieux, et je pense que cela devrait pouvoir être automatisé d'une manière ou d'une autre.
Matthew G
Sur SO, il est préférable de fournir un effort de recherche. Trouver comment mettre cela dans un alias ou un script est évident.
Gilles Quenot
2
Notez que l'ajout de la commande echo efface le code de sortie de la commande curl. L'option -w "\ n" de recourbement suggérée dans la réponse la plus populaire conserve le code de sortie de recourbement disponible pour inspection.
bradoaks
14

Pour plus d'informations ainsi qu'une nouvelle ligne propre après la boucle

~/.curlrc

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

(Plus d'options sont disponibles ici )

redirect_urlsera vide si la demande n'est pas redirigée ou si vous utilisez -Lpour suivre la redirection.

Exemple de sortie:

~ ➤  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"
~ ➤  

Modifier , pour rendre les choses plus lisibles, vous pouvez ajouter des couleurs ANSI à la -wligne, ce n'est pas si facile à écrire directement, mais ce script peut générer un ~/.curlrcfichier avec des couleurs.

#!/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
la source
1

La solution générale pour bash consiste à ajouter un symbole de nouvelle ligne dans l'invite de commande:

Voir la question connexe ( Comment avoir une nouvelle ligne avant l'invite bash? ) Et la réponse correspondante

Cette solution couvre chaque commande, pas seulement la boucle.

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

Le seul effet secondaire est que vous obtenez une invite de commande après chaque 2e ligne.

Dionio
la source