カールレスポンスボディの最後に改行を自動的に追加する


234

curlリクエストのHTTPレスポンスの本文に末尾の改行が含まれていない場合、シェルプロンプトが行の真ん中にあり、最後のcurlを配置したときと同じようにエスケープがめちゃくちゃになるという、この非常に煩わしい状態になってしまいます。画面上のコマンド、そのcurlコマンドから文字を削除すると、間違った文字が削除されます。

例えば:

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

プロンプトを画面の左端に戻すために、カール応答の最後に改行を自動的に追加するために使用できるトリックはありますか?


これらの回答はどれも、cygwinインストールのcurlのどのバージョンでも機能しません。echoコマンドでcurlコマンド全体をラップするだけで、たとえばecho "$(curl localhost:8001/api)"、この回答は再実行されます。unix.stackexchange.com
Alex Hall

回答:


418

manファイルから:

スクリプトプログラマがcurlの進行状況をよりよく知ることができるように、-w /-write-outオプションが導入されました。これを使用して、以前の転送から抽出する情報を指定できます。

ダウンロードされたバイト数をテキストと最後の改行とともに表示するには:

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

したがって、次のコードを~/.curlrcファイルに追加してみてください。

-w "\n"

46
:あなたはあなたのために行い、次のコマンドを実行することができますecho '-w "\n"' >> ~/.curlrc
tbraun

5
-w "\n"すべてのcurlコマンドとTIL に常に手動で追加します~/.curlrcが存在します!
Zhuoyun Wei

2
これは、Windowsのgit-bashでは機能しない可能性があります。私は私に追加-w "\nKLJLJKLJ LJKLLKJ"して~/.curlrcカールを走らせましたが、新しいラインも変なキャラクターもありませんでした。
jcollum 2017

@jcollum一部のWindowsポートはを優先_.ます。おそらく~/_curlrc、あなたのカールが探しているので、echo '-w "\n"' >> ~/_curlrcおそらくうまくいくでしょう。それは私のためです。ところで:カールがエスケープされていない空白文字の上に文句を言うだろう
user1129682

コマンドラインを使用して、-w "\n"または; echoを変更して追加することに価値があります.curlrc。curlrcを変更した場合、応答データの最後で改行を処理しないと、一部のスクリプトが壊れる可能性があります。個人的には、rcの変更よりもコマンドラインの追加にこだわっています。
ジェイソン

99

それを試してください:

curl jsonip.com; echo 

出力

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

これは、そのシンプルな;)

(そしてcurlコマンドに限らず、改行で終わらないすべてのコマンド)


3
これをスクリプトやbashエイリアスなどでラップする方法はありますか?すべての行の最後に「; echo」と入力するのは退屈な作業になる可能性があり、これは何らかの形で自動化できるはずだと感じています。
Matthew G

SOでは、検索作業を提供することをお勧めします。これをエイリアスまたはスクリプトに配置する方法を見つけるのは明らかです。
Gilles Quenot 2013年

2
echoコマンドを追加すると、curlコマンドから終了コードがクリアされることに注意してください。最も一般的な回答で提案されているcurlの-w "\ n"オプションを使用すると、curl終了コードを検査できるようになります。
ブラドック

14

詳細とカール後のクリーンな新しいラインについて

~/.curlrc

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

(より多くのオプションがここで利用可能です

redirect_url リクエストがリダイレクトされない場合、または使用した場合は空白になります -Lリダイレクトの追跡にする。

出力例:

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

編集して、より読みやすくするために、ANSI色を-w行に追加できます。直接書くのはそれほど簡単ではありませんが、このスクリプトは~/.curlrc色付きのファイルを生成できます。

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

1

bashの一般的な解決策は、コマンドプロンプトに改行記号を追加することです。

関連する質問(bashプロンプトの前に改行する方法 )と対応する回答を参照してください

このソリューションは、カールだけでなく、各コマンドをカバーします。

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

唯一の副作用は、2行目ごとにコマンドプロンプトが表示されることです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.