346 Stimmen

Automatisches Hinzufügen von Zeilenumbrüchen am Ende des curl-Antwortkörpers

Wenn der HTTP-Antwortkörper für eine curl-Anforderung keinen abschließenden Zeilenumbruch enthält, habe ich am Ende diesen wirklich ärgerlichen Zustand, bei dem der Shell-Prompt in der Mitte der Zeile steht und das Escaping so durcheinander gebracht wird, dass, wenn ich den letzten curl-Befehl auf den Bildschirm bringe, das Löschen von Zeichen aus diesem curl-Befehl die falschen Zeichen löscht.

Zum Beispiel:

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

Gibt es einen Trick, mit dem ich automatisch einen Zeilenumbruch am Ende einer curl-Antwort hinzufügen kann, um die Eingabeaufforderung wieder an den linken Bildschirmrand zu bekommen?

584voto

David J. Punkte 6046

Aus der man-Datei:

Um Skriptprogrammierern die Möglichkeit zu geben curl zu erfahren, wurde die Option -w/--write-out eingeführt. Mit dieser Option können Sie angeben können Sie angeben, welche Informationen der vorherigen Übertragung Sie extrahieren möchten.

So zeigen Sie die Anzahl der heruntergeladenen Bytes an abschließenden Zeilenumbruch:

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

Fügen Sie also Folgendes zu Ihrer ~/.curlrc Datei:

-w "\n"

138voto

Gilles Quenot Punkte 153339

Verwenden Sie dies:

curl jsonip.com; echo 

Wenn Sie Gruppierung um eine Rohr :

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

OUTPUT

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

Dies ist dass einfach ;)

(und nicht auf den Befehl curl beschränkt, sondern auf alle Befehle, die nicht mit einem Zeilenumbruch enden)

21voto

SColvin Punkte 8972

Für weitere Informationen sowie eine saubere neue Linie nach dem Locken

~/.curlrc

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

(Weitere Optionen sind verfügbar aquí )

redirect_url wird leer sein, wenn die Anfrage nicht umgeleitet wird oder Sie -L um der Weiterleitung zu folgen.

Beispielhafte Ausgabe:

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

bearbeiten Um die Lesbarkeit zu verbessern, können Sie die ANSI-Farben in der -w Zeile ist es nicht so einfach, direkt zu schreiben, aber cette Skript kann eine ~/.curlrc Datei mit Farben.

#!/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)

5voto

Dionio Punkte 51

Die allgemeine Lösung für die Bash ist das Hinzufügen eines Newline-Symbols in der Eingabeaufforderung:

Siehe dazugehörige Frage ( Wie ein Zeilenumbruch vor dem Bash-Prompt zu haben? ) und entsprechende Antwort

Diese Lösung deckt jeden Befehl ab, nicht nur curl.

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

Der einzige Nebeneffekt ist, dass Sie nach jeder zweiten Zeile eine Eingabeaufforderung erhalten.

2voto

akostadinov Punkte 16114

Es ist mir gelungen, eine neue Zeile dynamisch in die Eingabeaufforderung einzufügen, wenn die Befehlsausgabe keine neue Zeile am Ende enthielt. Es funktioniert also nicht nur mit curl aber auch jeder andere Befehl.

# 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"

meine Antwort auf der UL-Website: https://unix.stackexchange.com/a/647881/14907

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X