382 votes

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

Si le corps de la réponse HTTP d'une requête curl ne contient pas de nouvelle ligne de fin, je me retrouve dans une situation très ennuyeuse où l'invite de l'interpréteur de commandes se trouve au milieu de la ligne, et où l'échappement est suffisamment perturbé pour que, lorsque j'affiche la dernière commande curl à l'écran, la suppression des caractères de cette commande supprime les mauvais caractères.

Par exemple :

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

Existe-t-il une astuce permettant d'ajouter automatiquement une nouvelle ligne à la fin d'une réponse curl, afin de ramener l'invite sur le bord gauche de l'écran ?

1 votes

Aucune de ces réponses ne fonctionne pour moi, quelle que soit la version de curl dont dispose mon installation cygwin ; seul le fait d'envelopper la commande curl entière dans une déclaration echo fonctionne, par ex. echo "$(curl localhost:8001/api)" pour cette réponse : unix.stackexchange.com/a/217611/110338

1 votes

Pour json spécifiquement, curl -s https://jsonip.com | jq

638voto

David J. Points 1036

A partir du fichier de manuel :

Pour mieux permettre aux programmeurs de script d'être au courant de la progression de curl, l'option -w/--write-out a été introduite. En utilisant celle-ci, vous pouvez spécifier quelles informations du transfert précédent vous voulez extraire.

Pour afficher le nombre d'octets téléchargés ainsi qu'un texte et une et un saut de ligne final :

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

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

-w "\n"

88 votes

Vous pouvez exécuter la commande suivante qui le fait pour vous : echo '-w "\n"' >> ~/.curlrc

17 votes

J'ajoute toujours -w "\n" manuellement à chaque commande curl et TIL ~/.curlrc existe !

2 votes

Ceci peut ne pas fonctionner sous git-bash sous Windows ; j'ai ajouté -w "\nKLJLJKLJ LJKLLKJ" à mon ~/.curlrc et j'ai lancé un curl et je n'ai eu ni nouvelle ligne ni caractères bizarres.

148voto

sputnick Points 31663

Utilisez ça :

curl jsonip.com; echo 

Si vous avez besoin regroupement pour alimenter un tuyau :

{ curl jsonip.com; echo; } | tee new_file_with_newline

SORTIE

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

C'est que simple ;)

(et pas seulement la commande curl mais toutes les commandes qui ne se terminent pas par une nouvelle ligne)

3 votes

Y a-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 j'ai l'impression que cela devrait pouvoir être automatisé d'une manière ou d'une autre.

0 votes

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.

3 votes

Notez que l'ajout de la commande echo efface le code de sortie de la commande curl. L'option -w " \n "L'option de curl suggérée dans la réponse la plus populaire garde le code de sortie de curl disponible pour inspection.

23voto

SColvin Points 570

Pour plus d'informations ainsi qu'une nouvelle ligne propre après le bouclage

~/.curlrc

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

(D'autres options sont disponibles aquí )

redirect_url sera vide si la requête n'est pas redirigée ou si vous utilisez la fonction -L pour 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"
~   

Editar pour rendre les choses plus lisibles, vous pouvez ajouter des couleurs ANSI à l'adresse suivante -w il n'est pas si facile d'écrire directement, mais este script peut générer un ~/.curlrc 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)

6voto

Dionio Points 31

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

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

Cette solution couvre chaque commande, pas seulement curl.

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 2ème ligne.

2voto

akostadinov Points 3272

J'ai réussi à faire ajouter dynamiquement une nouvelle ligne à l'invite lorsque la sortie de commande n'avait pas de nouvelle ligne à la fin. Cela fonctionne donc non seulement avec curl mais aussi toute autre commande.

# https://github.com/dylanaraps/pure-bash-bible#get-the-current-cursor-position
new_line_ps1() {
  local _ y x _
  local LIGHT_YELLOW="\001\033[1;93m\002"
  local     RESET="\001\e[0m\002"

  IFS='[;' read -p $'\e[6n' -d R -rs _ y x _
  if [[ "$x" != 1 ]]; then
    printf "\n${LIGHT_YELLOW}^^ no newline at end of output ^^\n${RESET}"
  fi
}

PS1="\$(new_line_ps1)$PS1"

ma réponse dans le site UL : https://unix.stackexchange.com/a/647881/14907

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X