Automatycznie dodaj znak nowej linii na końcu treści odpowiedzi na zawijanie

234

Jeśli treść odpowiedzi HTTP na żądanie zwijania nie zawiera końcowego nowego wiersza, kończę z tym naprawdę irytującym stanem, w którym monit powłoki znajduje się na środku wiersza, a ucieczka jest wystarczająco pomieszana, że ​​kiedy wstawiam ostatni zwijający się polecenie na ekranie, usuwanie znaków z tego polecenia zwijania powoduje usunięcie niewłaściwych znaków.

Na przykład:

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

Czy istnieje sztuczka, której można użyć, aby automatycznie dodać nowy wiersz na końcu odpowiedzi zwijania, aby uzyskać monit z powrotem na lewej krawędzi ekranu?

Kevin Burke
źródło
Żadna z tych odpowiedzi nie działa dla mnie z każdą wersją curl, którą ma moja instalacja cygwin; tylko zawinięcie całego polecenia curl w instrukcji echa powoduje, na przykład echo "$(curl localhost:8001/api)", że ta odpowiedź jest następująca: unix.stackexchange.com/a/217611/110338
Alex Hall

Odpowiedzi:

418

Z pliku man:

Aby umożliwić programistom skryptów lepsze poznanie postępu zawijania, wprowadzono opcję wypisywania -w / -. Za pomocą tego możesz określić, jakie informacje z poprzedniego przelewu chcesz wyodrębnić.

Aby wyświetlić liczbę bajtów pobranych wraz z pewnym tekstem i końcowym znakiem nowej linii:

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

Spróbuj więc dodać do ~/.curlrcpliku:

-w "\n"
David J.
źródło
46
Możesz uruchomić następującą komendę:echo '-w "\n"' >> ~/.curlrc
tbraun
5
Zawsze dodam -w "\n"ręcznie do każdego polecenia curl i TIL ~/.curlrcistnieje!
Zhuoyun Wei,
2
może to nie działać w systemie git-bash w systemie Windows; Dodałem -w "\nKLJLJKLJ LJKLLKJ"do siebie ~/.curlrci uruchomiłem loki i nie dostałem ani nowej linii, ani dziwnych postaci.
jcollum,
@jcollum Niektóre porty Okna wolą _ponad .. Możliwe, że twoje loki szukają ~/_curlrci echo '-w "\n"' >> ~/_curlrcprawdopodobnie będą działać. To mi odpowiada. btw: curl będzie narzekał na
nieokreślone
Korzystanie z wiersza polecenia z dodatkiem -w "\n"lub dołączanie ; echogo do modyfikowania ma wartość .curlrc. Jeśli zmodyfikujesz curlrc, niektóre skrypty mogą ulec uszkodzeniu, jeśli nie będą obsługiwały nowego wiersza na końcu danych odpowiedzi. Osobiście trzymałbym się dodatków w wierszu poleceń zamiast modyfikowania rc.
Jason
99

Spróbuj tego :

curl jsonip.com; echo 

WYNIK

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

To takie proste;)

(i nie ogranicza się do polecenia curl, ale wszystkie polecenia, które nie kończą się nową linią)

Gilles Quenot
źródło
3
Czy jest jakiś sposób na zawinięcie tego w skrypt, alias bash lub coś podobnego? Wpisywanie „; echo” na końcu każdej linii może być nudne i wydaje mi się, że powinno to być w jakiś sposób zautomatyzowane.
Matthew G
Na SO lepiej jest zapewnić trochę wysiłku w zakresie wyszukiwania. Znalezienie sposobu umieszczenia tego w aliasie lub skrypcie jest oczywiste.
Gilles Quenot
2
Zauważ, że dodanie polecenia echo usuwa kod wyjścia z polecenia curl. Opcja -w "\ n" sugerowana w najpopularniejszej odpowiedzi powoduje, że kod wyjścia curl jest dostępny do wglądu.
bradoaks,
14

Aby uzyskać więcej informacji, a także czystą nową linię po zwijaniu

~/.curlrc

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

(Więcej opcji jest dostępnych tutaj )

redirect_urlbędzie puste, jeśli żądanie nie zostanie przekierowane lub użyjesz go -Ldo śledzenia.

Przykładowe dane wyjściowe:

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

Edytuj , aby uczynić rzeczy bardziej czytelnymi, możesz dodać kolory -wlinii ANSI do linii, nie jest tak łatwo pisać bezpośrednio, ale ten skrypt może wygenerować ~/.curlrcplik z kolorami.

#!/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
źródło
1

Ogólnym rozwiązaniem dla bash jest dodanie symbolu wiersza polecenia do wiersza poleceń:

Zobacz powiązane pytanie ( Jak uzyskać znak nowej linii przed monitem bash? ) I odpowiednią odpowiedź

To rozwiązanie obejmuje każde polecenie, a nie tylko zawinięcie.

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

Jedynym efektem ubocznym jest to, że po każdym drugim wierszu pojawia się wiersz polecenia.

Dionio
źródło