296

如果 curl 请求的 HTTP 响应正文不包含尾随换行符,我最终会遇到这种非常烦人的情况,其中 shell 提示符位于行的中间,并且转义非常混乱,以至于当我放置最后一个 curl 时屏幕上的命令,从该 curl 命令中删除字符会删除错误的字符。

例如:

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

有没有一种技巧可以用来在 curl 响应的末尾自动添加换行符,以使提示回到屏幕的左边缘?

4

5 回答 5

517

从 man 文件中:

为了更好地让脚本程序员了解 curl 的进度,引入了 -w/--write-out 选项。使用它,您可以指定要从之前的传输中提取哪些信息。

要显示下载的字节数以及一些文本和结束换行符:

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

因此,请尝试将以下内容添加到您的~/.curlrc文件中:

-w "\n"
于 2013-01-30T21:32:43.560 回答
123

用这个:

curl jsonip.com; echo 

如果您需要分组来馈送管道

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

输出

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

就是这么简单;)

(不仅限于 curl 命令,还包括所有不以换行符结尾的命令)

于 2012-10-11T22:34:25.230 回答
16

有关更多信息以及 curl 后的干净新行

~/.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)
于 2017-05-19T21:47:29.630 回答
3

bash 的一般解决方案是在命令提示符中添加换行符:

请参阅相关问题(如何在 bash 提示之前换行? )和相应的答案

该解决方案涵盖了每个命令,而不仅仅是 curl。

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

唯一的副作用是您在每 2 行之后都会收到命令提示符。

于 2019-07-24T11:28:27.730 回答
0

当命令输出末尾没有新行时,我设法动态添加新行以提示。所以它不仅适用于任何其他命令,curl也适用于任何其他命令。

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

我在 UL 网站上的回答:https ://unix.stackexchange.com/a/647881/14907

于 2021-05-03T16:06:11.650 回答