Fügen Sie am Ende des Curl-Antwortkörpers automatisch eine neue Zeile hinzu

234

Wenn der HTTP-Antworttext für eine Curl-Anforderung keinen nachgestellten Zeilenumbruch enthält, kommt es zu diesem wirklich ärgerlichen Zustand, bei dem sich die Shell-Eingabeaufforderung in der Mitte der Zeile befindet und das Escape-Zeichen so durcheinander ist, dass beim Einsetzen des letzten Curls Befehl auf dem Bildschirm, Löschen von Zeichen aus diesem Curl-Befehl Löschen Sie die falschen Zeichen.

Beispielsweise:

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

Gibt es einen Trick, mit dem ich am Ende einer Curl-Antwort automatisch eine neue Zeile hinzufügen kann, um die Eingabeaufforderung wieder am linken Bildschirmrand anzuzeigen?

Kevin Burke
quelle
Keine dieser Antworten funktioniert für mich mit der Version von Curl, die meine Cygwin-Installation hat. Nur das Umschließen des gesamten Curl-Befehls in eine Echo-Anweisung führt beispielsweise zu echo "$(curl localhost:8001/api)"dieser Antwort: unix.stackexchange.com/a/217611/110338
Alex Hall

Antworten:

417

Aus der Man-Datei:

Damit Skriptprogrammierer den Fortschritt des Einrollen besser kennenlernen können, wurde die Option zum Ausschreiben -w / - eingeführt. Auf diese Weise können Sie angeben, welche Informationen aus der vorherigen Übertragung Sie extrahieren möchten.

So zeigen Sie die Anzahl der heruntergeladenen Bytes zusammen mit Text und einem abschließenden Zeilenumbruch an:

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

Fügen Sie Ihrer ~/.curlrcDatei also Folgendes hinzu :

-w "\n"
David J.
quelle
45
Sie können den folgenden Befehl ausführen, der das für Sie echo '-w "\n"' >> ~/.curlrc
erledigt
5
Ich füge immer -w "\n"manuell zu jedem Curl-Befehl hinzu und TIL ~/.curlrcexistiert!
Zhuoyun Wei
2
Dies funktioniert möglicherweise nicht unter Git-Bash unter Windows. Ich fügte -w "\nKLJLJKLJ LJKLLKJ"meiner hinzu ~/.curlrcund ließ eine Locke laufen und bekam weder eine neue Linie noch die seltsamen Charaktere.
JCollum
@jcollum Einige Windows - Ports bevorzugen _über .. Die Chancen stehen gut, dass Ihre Locke sucht ~/_curlrcund folglich echo '-w "\n"' >> ~/_curlrcwahrscheinlich funktioniert. Das tut es für mich. Übrigens: Curl wird sich über Leerzeichen beschweren
user1129682
Es ist sinnvoll, die Befehlszeile zu verwenden -w "\n"oder ; echoüber das Ändern Ihrer zu hängen .curlrc. Wenn Sie Ihre Curlrc ändern, können einige Skripte unterbrochen werden, wenn sie am Ende der Antwortdaten keine neue Zeile verarbeiten. Ich persönlich würde mich an die Ergänzungen in der Befehlszeile halten, um den RC zu ändern.
Jason
99

Versuch das :

curl jsonip.com; echo 

AUSGABE

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

So einfach ist das ;)

(und nicht beschränkt auf den Befehl curl, sondern auf alle Befehle, die nicht mit einer neuen Zeile enden)

Gilles Quenot
quelle
3
Gibt es eine Möglichkeit, dies in ein Skript oder einen Bash-Alias ​​oder ähnliches zu verpacken? Das Eingeben von "; echo" am Ende jeder Zeile kann mühsam werden, und ich denke, dies sollte irgendwie automatisiert werden können.
Matthew G
Bei SO ist es besser, einen gewissen Suchaufwand bereitzustellen. Es liegt auf der Hand, wie man dies in einen Alias ​​oder ein Skript einfügt.
Gilles Quenot
2
Beachten Sie, dass durch Hinzufügen des Befehls echo der Exit-Code aus dem Befehl curl gelöscht wird. Die in der beliebtesten Antwort vorgeschlagene Option -w "\ n" zum Einrollen hält den Curl-Exit-Code zur Überprüfung verfügbar.
Bradoaks
14

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

~/.curlrc

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

(Weitere Optionen finden Sie hier )

redirect_urlwird leer sein, wenn die Anfrage nicht umgeleitet wird oder Sie -Lder Weiterleitung folgen.

Beispielausgabe:

~ ➤  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 der -wZeile ANSI-Farben hinzufügen. Es ist nicht so einfach, direkt zu schreiben, aber dieses Skript kann eine ~/.curlrcDatei mit Farben generieren .

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

Die allgemeine Lösung für Bash besteht darin, der Eingabeaufforderung ein Zeilenumbruchsymbol hinzuzufügen:

Siehe verwandte Frage ( Wie bekomme ich eine neue Zeile vor der Bash-Eingabeaufforderung? ) Und die entsprechende Antwort

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

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.

Dionio
quelle