在 curl 响应正文的末尾自动添加换行符

Posted

技术标签:

【中文标题】在 curl 响应正文的末尾自动添加换行符【英文标题】:Automatically add newline at end of curl response body 【发布时间】:2012-10-02 17:01:26 【问题描述】:

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

例如:

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

我可以使用什么技巧在 curl 响应的末尾自动添加换行符,以使提示回到屏幕的左边缘?

【问题讨论】:

这些答案都不适用于我的 cygwin 安装的任何版本的 curl;仅将整个 curl 命令包装在 echo 语句中,例如echo "$(curl localhost:8001/api)",回复这个答案:unix.stackexchange.com/a/217611/110338 专门针对 json,curl -s https://jsonip.com | jq 【参考方案1】:

使用这个:

curl jsonip.com; echo 

如果您需要 分组 来提供 管道

 curl jsonip.com; echo;  | tee new_file_with_newline

输出

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

简单;)

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

【讨论】:

有没有办法将它包装在脚本或 bash 别名或类似的东西中?在每一行的末尾键入“; echo”可能会很乏味,我觉得这应该能够以某种方式自动化。 在 SO 上,最好提供一些搜索工作。找到如何将其放入别名或脚本中是显而易见的。 请注意,添加 echo 命令会清除 curl 命令的退出代码。最流行的答案中建议的 curl 选项 -w "\n" 使 curl 退出代码可供检查。【参考方案2】:

来自 man 文件:

为了更好地让脚本程序员了解 curl,引入了 -w/--write-out 选项。使用它,您可以指定 你想从上次传输中提取什么信息。

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

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

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

-w "\n"

【讨论】:

您可以运行以下命令为您执行此操作:echo '-w "\n"' >> ~/.curlrc 我总是在每个 curl 命令中手动添加-w "\n",并且 TIL ~/.curlrc 存在! 这可能无法在 Windows 上的 git-bash 下运行;我将 -w "\nKLJLJKLJ LJKLLKJ" 添加到我的 ~/.curlrc 并运行 curl 并没有得到新行或奇怪的字符。 @jcollum 一些 Windows 端口更喜欢_ 而不是.。您的 curl 可能正在寻找 ~/_curlrc,因此 echo '-w "\n"' >> ~/_curlrc 可能会起作用。它对我有用。顺便说一句:curl 会抱怨未转义的空格 在命令行中使用-w "\n" 或附加; echo 比修改.curlrc 更有价值。如果您修改 curlrc,如果某些脚本不处理响应数据末尾的换行符,它们可能会中断。我个人会坚持在命令行上添加而不是修改 rc。【参考方案3】:

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

~/.curlrc

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

(更多选项可用here)

如果请求没有被重定向或者您使用-L 跟随重定向,redirect_url 将为空。

示例输出:

~ ➤  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 行,直接编写并不容易,但 this 脚本可以生成 ~/.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:\nto: '.format(content, path))
path.write_text(content)

【讨论】:

【参考方案4】:

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

查看相关问题(How to have a newline before bash prompt? )和对应的answer

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

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

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

【讨论】:

【参考方案5】:

我设法在命令输出末尾没有新行时动态添加新行以进行提示。所以它不仅适用于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

【讨论】:

以上是关于在 curl 响应正文的末尾自动添加换行符的主要内容,如果未能解决你的问题,请参考以下文章

cURL 配置文件 (-k / --config) JSON 换行符

在 bash 文件末尾添加换行符

为啥我必须费心在每个文件的末尾添加换行符?

如果在文件末尾省略PHP块的结束标记,是否会删除任何换行符或空格(如果存在于相应的文件中)?

print默认在末尾添加一个换行符,但其实也可以不用!

notepad++为啥每次粘贴都会自动换行