curl 技巧:将远程文件内容直接输出到标准输出 (stdout) – wiki基地


深入探索 cURL:将远程文件内容直接输出到标准输出 (stdout) 的技巧与实践

在现代计算环境中,尤其是在 Linux/Unix 系统和 DevOps 工作流中,命令行工具扮演着至关重要的角色。curl(通常发音为 “curl”)无疑是其中最强大、最灵活、使用最广泛的工具之一。它是一个用于传输数据的命令行工具和库,支持包括 HTTP, HTTPS, FTP, FTPS, SCP, SFTP, LDAP, SMB, SMTP, POP3, IMAP 等在内的多种协议。curl 的一个核心且极其有用的功能是能够获取远程资源(通常是文件或 API 响应)并将其内容直接输出到标准输出(stdout)。

标准输出(stdout)是 Unix/Linux 哲学中的一个基本概念。它是一个默认的数据流通道,程序通常将它们的正常输出发送到这里。结合管道(|)和重定向(>>>),stdout 使得命令之间能够无缝地连接和协作,创建出强大的数据处理流水线。将远程文件内容直接输出到 stdout 的能力,使得 curl 可以轻松地融入这些流水线,实现诸如在线处理、内容检查、数据转换等多种任务,而无需先将文件保存到本地磁盘。

本文将深入探讨如何利用 curl 将远程文件的内容直接输出到 stdout,涵盖从基础用法到高级技巧、错误处理、性能考量以及实际应用场景,旨在为您提供一份全面而详实的指南。

一、curl 的基本用法:默认行为即输出到 stdout

curl 设计的一个优雅之处在于,其最基本的用法就已经满足了我们“将远程内容输出到 stdout”的需求。当你提供一个 URL 给 curl 时,它会尝试获取该 URL 指向的资源,并将接收到的主体内容(body)打印到标准输出。

基础语法:

bash
curl [options] <URL>

简单示例:

假设我们要获取一个远程服务器上的文本文件 example.txt 的内容。

“`bash

获取 example.com 上的 example.txt 文件内容

curl http://example.com/files/example.txt
“`

如果 http://example.com/files/example.txt 这个 URL 是有效的,并且服务器返回了该文件的内容,那么文件的文本内容将直接显示在你的终端上。这正是标准输出的行为。

同样地,如果你请求的是一个 API 端点,该端点返回 JSON 数据,curl 也会将原始的 JSON 字符串输出到 stdout。

“`bash

获取一个返回 JSON 的 API 端点

curl https://api.github.com/users/octocat
“`

这将输出 GitHub API 返回的关于用户 “octocat” 的 JSON 数据。

核心要点: curl 的默认行为就是将成功获取的 HTTP/FTP 等协议的响应主体(不包括响应头)输出到 stdout。这就是实现目标的最直接方式。

二、控制输出:静默模式与错误显示

虽然默认行为很方便,但在脚本或管道中使用 curl 时,通常不希望看到 curl 自带的进度条和传输统计信息。这些额外的信息会干扰后续命令对纯净数据的处理。

1. 静默模式 (-s--silent)

--silent 或其缩写 -s 选项告诉 curl 不要显示进度表或错误消息。它会使 curl 完全静默,只输出从服务器接收到的数据。

“`bash

使用静默模式获取文件内容,只输出文件内容

curl -s http://example.com/files/example.txt
“`

在管道中使用时,-s 几乎是必需的:

“`bash

获取文件内容并用 grep 搜索特定模式

curl -s http://example.com/files/example.txt | grep “important keyword”

获取 JSON 数据并用 jq 工具格式化和查询

curl -s https://api.github.com/users/octocat | jq ‘.name’
“`

2. 在静默模式下显示错误 (-S--show-error)

单独使用 -s 的一个缺点是,如果发生错误(例如,网络问题、URL 无效、服务器错误),curl 不会显示任何错误信息,这使得调试变得困难。为了解决这个问题,可以结合使用 -s-S (--show-error)。

-S 选项在 -s 的基础上,如果 curl 因错误失败,它仍然会输出错误信息到 stderr(标准错误输出)。这使得你可以在保持 stdout 清洁的同时,仍然能够捕获和记录错误。

“`bash

静默模式,但如果出错则显示错误信息

curl -sS http://example.com/nonexistent_file.txt

如果文件不存在 (404 Not Found),stdout 将为空,

但 stderr 会显示类似 “curl: (22) The requested URL returned error: 404” 的信息

“`

在脚本中,这通常是推荐的组合,因为它既能提供干净的数据输出,又能提供必要的错误反馈。

“`bash

脚本示例

content=$(curl -sS https://example.com/data.json)
exit_code=$?

if [ $exit_code -ne 0 ]; then
echo “Error fetching data. curl exited with code $exit_code” >&2 # 输出到 stderr
exit 1
fi

如果成功,继续处理 $content

echo “$content” | jq .
“`

三、处理 HTTP 重定向 (-L--location)

Web 上的资源经常会移动位置。当请求一个 URL 时,服务器可能会返回一个 HTTP 重定向状态码(如 301 Moved Permanently 或 302 Found),并在 Location 响应头中提供新的 URL。默认情况下,curl 不会跟随重定向,它只会输出重定向响应本身(通常是一个简短的 HTML 页面说明重定向)。

要让 curl 自动跟随重定向,直到找到最终的资源内容,需要使用 -L--location 选项。

“`bash

假设 short.ly/resource 重定向到 long.example.com/actual/resource.txt

没有 -L,可能只得到重定向信息

curl -s http://short.ly/resource

使用 -L,curl 会跟随重定向并获取最终文件的内容输出到 stdout

curl -sL http://short.ly/resource
“`

在获取不确定是否会发生重定向的远程文件时,使用 -L 是一个好习惯,以确保你得到的是实际内容而不是重定向指令。

四、处理 HTTP 错误 (-f--fail)

当你请求一个不存在的资源(404 Not Found)或无权访问的资源(403 Forbidden)时,服务器通常会返回一个 HTML 错误页面。默认情况下,curl 会将这个 HTML 错误页面作为“成功”获取的内容输出到 stdout。这在期望得到特定格式数据(如 JSON 或纯文本)的管道中是有问题的,因为后续命令会接收到非预期的 HTML。

--fail 或其缩写 -f 选项可以改变这种行为。当 HTTP 服务器返回错误状态码(4xx 或 5xx)时,--fail 会阻止 curl 将错误页面输出到 stdout(即 stdout 将为空),并且 curl 会以非零状态码(通常是 22)退出。

“`bash

请求一个不存在的文件

默认情况,会输出服务器返回的 404 页面 HTML

curl http://example.com/nonexistent_file.txt

使用 -f,如果发生 HTTP 错误 (如 404),则不输出任何内容到 stdout,并以错误码退出

curl -sf http://example.com/nonexistent_file.txt

stdout: (空)

echo $? (显示退出码,非 0)

结合 -L 和 -S 使用

curl -fsSL http://example.com/potentially_moved_or_missing_file.txt

这个组合非常常用:

-f: 对 HTTP 错误静默失败(不输出错误页面到 stdout)

-s: 静默模式,隐藏进度条

-S: 如果发生错误(包括 -f 导致的失败),在 stderr 显示错误信息

-L: 跟随重定向

“`

-f 对于编写健壮的脚本至关重要,它确保了只有在成功获取资源(HTTP 状态码 2xx)时,数据才会流向 stdout 和后续的处理步骤。

五、处理不同协议:FTP 示例

curl 不仅限于 HTTP(S),它同样可以从 FTP 服务器获取文件内容并输出到 stdout。

匿名 FTP:

“`bash

获取 FTP 服务器上的 README 文件内容

curl -s ftp://ftp.example.com/pub/README
“`

需要认证的 FTP:

可以使用 -u--user 选项提供用户名和密码。

“`bash

提供用户名和密码

curl -s -u username:password ftp://ftp.example.com/private/document.txt

更安全的方式:使用 .netrc 文件或让 curl 提示输入密码

curl -s –netrc ftp://ftp.example.com/private/document.txt

curl -s -u username ftp://ftp.example.com/private/document.txt # 会提示输入密码

“`

注意:curl 请求一个 FTP URL 指向目录而不是文件时,它默认会列出目录内容到 stdout。如果你确定 URL 指向的是文件,上述命令会直接输出文件内容。

六、高级技巧与选项

除了上述常用选项,还有一些其他选项可以影响或辅助将内容输出到 stdout 的过程:

1. 指定 HTTP 方法 (-X--request)

虽然获取文件内容通常使用 GET 方法(默认),但有时你可能需要使用其他方法(如 POST)与 API 交互,并将其响应输出到 stdout。

“`bash

向 API 发送 POST 请求,并将 JSON 响应输出到 stdout

curl -s -X POST -H “Content-Type: application/json” -d ‘{“key”:”value”}’ https://api.example.com/process
“`

2. 添加 HTTP 头 (-H--header)

某些服务器或 API 可能需要特定的 HTTP 头(如 Authorization 进行认证,Accept 指定期望的内容类型,User-Agent 模拟浏览器)。这些头信息可能会影响服务器返回的内容。

“`bash

使用 Bearer Token 认证并获取 JSON 数据

curl -sL -H “Authorization: Bearer YOUR_ACCESS_TOKEN” https://api.example.com/data

请求服务器返回 JSON 而不是 HTML

curl -sL -H “Accept: application/json” https://example.com/resource
“`

3. 设置 User-Agent (-A--user-agent)

有些网站会根据 User-Agent 返回不同的内容,或者阻止默认的 curl User-Agent。

“`bash

模拟 Firefox 浏览器访问

curl -sL -A “Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:89.0) Gecko/20100101 Firefox/89.0” https://example.com
“`

4. 超时控制

在不稳定的网络或响应缓慢的服务器上,设置超时很重要。
* --connect-timeout <seconds>: 连接超时。
* --max-time <seconds>: 总传输时间限制。

“`bash

设置 5 秒连接超时,30 秒总传输超时

curl -sL –connect-timeout 5 –max-time 30 https://slow.example.com/large_file.txt
“`

5. 压缩 (--compressed)

如果服务器支持,请求压缩传输(如 gzip)可以减少传输时间。curl 会自动解压并将原始内容输出到 stdout。

bash
curl -sL --compressed https://example.com/data.json

6. 忽略 SSL/TLS 证书验证 (-k--insecure)

警告: 仅在完全理解风险的情况下用于测试或内部网络。这会使连接容易受到中间人攻击。

“`bash

忽略无效或自签名的 SSL 证书(不推荐在生产环境使用)

curl -sLk https://internal.server.local/file.txt
“`

七、实际应用场景与管道示例

将远程内容直接输出到 stdout 的真正威力体现在与其他命令的结合上。

1. 在线搜索内容:

“`bash

在远程日志文件中搜索错误信息

curl -sL http://logs.example.com/app.log | grep -i “ERROR”

在维基百科页面源码中查找特定链接

curl -sL https://en.wikipedia.org/wiki/Curl_(programming_language) | grep ‘href=”/wiki/’
“`

2. 在线处理文本:

“`bash

获取远程 CSV 文件,提取第二列,排序并去重

curl -sL http://data.example.com/report.csv | cut -d’,’ -f2 | sort | uniq

获取网页标题

curl -sL https://example.com | grep -o ‘.*‘ | sed -e ‘s///’ -e ‘s/<\/title>//’<br /> “`</p> <p><strong>3. 处理 JSON API 响应:</strong></p> <p>“`bash</p> <h1>获取天气 API 数据,并提取当前温度 (使用 jq)</h1> <p>curl -sL ‘https://api.weatherapi.com/v1/current.json?key=YOUR_API_KEY&q=London’ | jq ‘.current.temp_c’</p> <h1>获取 GitHub 项目的最新 release tag</h1> <p>curl -sL https://api.github.com/repos/stedolan/jq/releases/latest | jq -r ‘.tag_name’<br /> “`</p> <p><strong>4. 快速预览文件内容:</strong></p> <p>“`bash</p> <h1>使用 less 分页查看远程大文件内容,无需下载</h1> <p>curl -sL http://very.large.server/huge_log_file.log | less<br /> “`</p> <p><strong>5. 比较远程文件:</strong></p> <p>使用进程替换 (<code><(command)</code>),可以在不保存文件的情况下比较两个远程文件的内容。</p> <p>“`bash</p> <h1>比较两个远程配置文件的差异</h1> <p>diff <(curl -sL http://server1/config.conf) <(curl -sL http://server2/config.conf)<br /> “`</p> <p><strong>6. 在脚本中获取内容:</strong></p> <p>“`bash</p> <h1>!/bin/bash</h1> <h1>获取公网 IP 地址</h1> <p>my_ip=$(curl -sL https://api.ipify.org)<br /> echo “My public IP is: $my_ip”</p> <h1>检查网站健康状态 (期望返回特定字符串)</h1> <p>health_status=$(curl -sL –max-time 5 http://app.example.com/health)<br /> if [[ “$health_status” == “OK” ]]; then<br /> echo “App is healthy.”<br /> else<br /> echo “App health check failed. Status: $health_status”<br /> fi<br /> “`</p> <h3>八、注意事项与潜在陷阱</h3> <p><strong>1. 二进制文件:</strong><br /> 将二进制文件(如图片、音频、压缩包)的内容直接输出到 stdout 通常不是个好主意,因为它会向你的终端输出乱码,甚至可能搞乱终端设置。对于二进制文件,应该使用 <code>-o <filename></code> 或 <code>-O</code> 将其保存到文件。</p> <p>“`bash</p> <h1>正确下载二进制文件的方式</h1> <p>curl -L http://example.com/image.jpg -o downloaded_image.jpg<br /> curl -LO http://example.com/archive.zip # -O 使用 URL 中的文件名<br /> “`</p> <p><strong>2. 大文件与内存:</strong><br /> 当使用管道处理 <code>curl</code> 输出时,数据通常是流式处理的,这意味着 <code>curl</code> 下载一部分,后续命令处理一部分,内存占用相对可控。但是,如果后续命令需要将所有输入读入内存才能处理(某些 <code>sort</code> 实现或脚本语言中的某些操作),那么处理非常大的远程文件可能会消耗大量内存。同样,如果将 <code>curl</code> 输出直接赋值给 shell 变量 (<code>var=$(curl ...)</code>), 整个文件内容会被读入内存。对于超大文件,先下载再处理可能更稳妥。</p> <p><strong>3. 错误处理的复杂性:</strong><br /> 虽然 <code>-f</code>, <code>-s</code>, <code>-S</code> 提供了不错的错误处理机制,但在复杂的脚本中,检查 <code>curl</code> 的退出码 (<code>$?</code>) 并可能解析 stderr 的错误信息是确保鲁棒性的关键。<code>curl</code> 有多种退出码,对应不同的错误类型(网络、HTTP 协议、文件系统等),详见 <code>man curl</code>。</p> <p><strong>4. 编码问题:</strong><br /> 远程文件的文本编码可能与你的本地环境不同。<code>curl</code> 通常按原样输出字节流。如果遇到乱码,可能需要后续命令(如 <code>iconv</code>)进行编码转换。</p> <p>“`bash</p> <h1>假设远程文件是 GBK 编码,转换为 UTF-8</h1> <p>curl -sL http://example.com/gbk_file.txt | iconv -f GBK -t UTF-8<br /> “`</p> <p><strong>5. Rate Limiting 和服务器负载:</strong><br /> 在脚本中频繁使用 <code>curl</code> 访问同一服务器时,要注意对方可能存在的速率限制。过度请求可能导致 IP 被封禁。同时,也要考虑不要给目标服务器带来不必要的负载。适当添加延时 (<code>sleep</code>) 或使用缓存机制。</p> <h3>九、替代方案简介</h3> <p>虽然 <code>curl</code> 是主力,但有时其他工具也能完成类似任务:</p> <ul> <li><strong><code>wget</code>:</strong> 另一个流行的下载工具。<code>wget -qO- <URL></code> 可以实现与 <code>curl -sL <URL></code> 类似的效果(<code>-q</code> 静默,<code>-O-</code> 输出到 stdout)。<code>wget</code> 在递归下载网站方面更强,但在 HTTP 方法、头控制等方面 <code>curl</code> 通常更灵活。</li> <li><strong>脚本语言内置库:</strong> Python (<code>requests</code>, <code>urllib</code>), Node.js (<code>axios</code>, <code>node-fetch</code>), Ruby (<code>net/http</code>), Perl (<code>LWP::Simple</code>) 等语言都有强大的 HTTP 客户端库,可以在脚本内部更精细地控制请求和处理响应,包括直接处理内存中的内容。当逻辑复杂时,这些通常比纯 shell 脚本加 <code>curl</code> 更易维护。</li> </ul> <h3>十、结论</h3> <p><code>curl</code> 将远程文件内容直接输出到标准输出(stdout)的能力是其核心功能之一,也是其在命令行工具箱中不可或缺的原因。通过理解其默认行为,并熟练运用 <code>-s</code>, <code>-S</code>, <code>-L</code>, <code>-f</code> 等关键选项,我们可以精确控制输出,处理重定向和错误,使其完美融入 Unix/Linux 的管道哲学。无论是快速检查文件内容、实时处理 API 数据流,还是在自动化脚本中获取配置或状态信息,<code>curl</code> 的这一特性都提供了无与伦比的便利性和灵活性。</p> <p>掌握 <code>curl</code> 的 stdout 输出技巧,意味着你可以用更少的代码、更低的资源消耗(无需临时文件)来完成更多网络相关的任务。虽然需要注意处理二进制数据、大文件和错误情况的细节,但其带来的效率提升和与其他工具的无缝集成能力,使得深入学习和使用 <code>curl</code> 成为每个开发者、系统管理员和 DevOps 工程师的宝贵技能。不断实践这些技巧,并查阅 <code>curl</code> 的 man page (<code>man curl</code>) 以探索更多高级功能,将使你能够更加自如地驾驭网络数据的获取与处理。</p> <hr /> </div><!-- .entry-content .clear --> </div> </article><!-- #post-## --> <nav class="navigation post-navigation" aria-label="Post navigation"> <span class="screen-reader-text">Post navigation</span> <div class="nav-links"><div class="nav-previous"><a title="PowerShell vs Cmd:了解 PowerShell 的优势与特点 - wiki基地" href="https://wkbse.com/2025/05/02/powershell-vs-cmd%ef%bc%9a%e4%ba%86%e8%a7%a3-powershell-%e7%9a%84%e4%bc%98%e5%8a%bf%e4%b8%8e%e7%89%b9%e7%82%b9-wiki%e5%9f%ba%e5%9c%b0/" rel="prev"><span class="ast-post-nav"><span aria-hidden="true" class="ahfb-svg-iconset ast-inline-flex svg-baseline"><svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 448 512'><path d='M134.059 296H436c6.627 0 12-5.373 12-12v-56c0-6.627-5.373-12-12-12H134.059v-46.059c0-21.382-25.851-32.09-40.971-16.971L7.029 239.029c-9.373 9.373-9.373 24.569 0 33.941l86.059 86.059c15.119 15.119 40.971 4.411 40.971-16.971V296z'></path></svg></span> Previous</span> <p> PowerShell vs Cmd:了解 PowerShell 的优势与特点 – wiki基地 </p></a></div><div class="nav-next"><a title="PowerShell 自动更新与手动更新方法 - wiki基地" href="https://wkbse.com/2025/05/02/powershell-%e8%87%aa%e5%8a%a8%e6%9b%b4%e6%96%b0%e4%b8%8e%e6%89%8b%e5%8a%a8%e6%9b%b4%e6%96%b0%e6%96%b9%e6%b3%95-wiki%e5%9f%ba%e5%9c%b0/" rel="next"><span class="ast-post-nav">Next <span aria-hidden="true" class="ahfb-svg-iconset ast-inline-flex svg-baseline"><svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 448 512'><path d='M313.941 216H12c-6.627 0-12 5.373-12 12v56c0 6.627 5.373 12 12 12h301.941v46.059c0 21.382 25.851 32.09 40.971 16.971l86.059-86.059c9.373-9.373 9.373-24.569 0-33.941l-86.059-86.059c-15.119-15.119-40.971-4.411-40.971 16.971V216z'></path></svg></span></span> <p> PowerShell 自动更新与手动更新方法 – wiki基地 </p></a></div></div> </nav> <div id="comments" class="comments-area comment-form-position-below "> <div id="respond" class="comment-respond"> <h3 id="reply-title" class="comment-reply-title">发表评论 <small><a rel="nofollow" id="cancel-comment-reply-link" href="/2025/05/02/curl-%E6%8A%80%E5%B7%A7%EF%BC%9A%E5%B0%86%E8%BF%9C%E7%A8%8B%E6%96%87%E4%BB%B6%E5%86%85%E5%AE%B9%E7%9B%B4%E6%8E%A5%E8%BE%93%E5%87%BA%E5%88%B0%E6%A0%87%E5%87%86%E8%BE%93%E5%87%BA-stdout-wiki/#respond" style="display:none;">取消回复</a></small></h3><form action="https://wkbse.com/wp-comments-post.php" method="post" id="ast-commentform" class="comment-form"><p class="comment-notes"><span id="email-notes">您的邮箱地址不会被公开。</span> <span class="required-field-message">必填项已用 <span class="required">*</span> 标注</span></p><div class="ast-row comment-textarea"><fieldset class="comment-form-comment"><legend class ="comment-form-legend"></legend><div class="comment-form-textarea ast-grid-common-col"><label for="comment" class="screen-reader-text">在此输入...</label><textarea id="comment" name="comment" placeholder="在此输入..." cols="45" rows="8" aria-required="true"></textarea></div></fieldset></div><div class="ast-comment-formwrap ast-row"> <p class="comment-form-author ast-grid-common-col ast-width-lg-33 ast-width-md-4 ast-float"> <label for="author" class="screen-reader-text">Name*</label> <input id="author" name="author" type="text" value="" placeholder="Name*" size="30" aria-required='true' autocomplete="name" /> </p> <p class="comment-form-email ast-grid-common-col ast-width-lg-33 ast-width-md-4 ast-float"> <label for="email" class="screen-reader-text">电子邮箱*</label> <input id="email" name="email" type="text" value="" placeholder="电子邮箱*" size="30" aria-required='true' autocomplete="email" /> </p> <p class="comment-form-url ast-grid-common-col ast-width-lg-33 ast-width-md-4 ast-float"> <label for="url" class="screen-reader-text">网站</label> <input id="url" name="url" type="text" value="" placeholder="网站" size="30" autocomplete="url" /> </p> </div> <p class="comment-form-cookies-consent"><input id="wp-comment-cookies-consent" name="wp-comment-cookies-consent" type="checkbox" value="yes" /> <label for="wp-comment-cookies-consent">在此浏览器中保存我的显示名称、邮箱地址和网站地址,以便下次评论时使用。</label></p> <p class="form-submit"><input name="submit" type="submit" id="submit" class="submit" value="发表评论" /> <input type='hidden' name='comment_post_ID' value='3389' id='comment_post_ID' /> <input type='hidden' name='comment_parent' id='comment_parent' value='0' /> </p></form> </div><!-- #respond --> </div><!-- #comments --> </main><!-- #main --> </div><!-- #primary --> <div class="widget-area secondary" id="secondary" itemtype="https://schema.org/WPSideBar" itemscope="itemscope"> <div class="sidebar-main" > <aside id="block-12" class="widget widget_block"> <h2 class="wp-block-heading">recent post</h2> </aside><aside id="block-10" class="widget widget_block widget_recent_entries"><ul class="wp-block-latest-posts__list wp-block-latest-posts"><li><a class="wp-block-latest-posts__post-title" href="https://wkbse.com/2025/06/14/ultra-mobile-%e5%a5%97%e9%a4%90%e3%80%81%e7%bd%91%e7%bb%9c%e3%80%81%e7%89%b9%e7%82%b9%e8%af%a6%e7%bb%86%e4%bb%8b%e7%bb%8d-wiki%e5%9f%ba%e5%9c%b0/">Ultra Mobile 套餐、网络、特点详细介绍 – wiki基地</a></li> <li><a class="wp-block-latest-posts__post-title" href="https://wkbse.com/2025/06/14/kotlin-coroutines-%e5%85%a5%e9%97%a8%e6%8c%87%e5%8d%97-wiki%e5%9f%ba%e5%9c%b0/">Kotlin Coroutines 入门指南 – wiki基地</a></li> <li><a class="wp-block-latest-posts__post-title" href="https://wkbse.com/2025/06/14/%e5%86%99%e5%a5%bdprompt%e7%9a%84%e7%ac%ac%e4%b8%80%e6%ad%a5%ef%bc%9a%e4%b8%80%e7%af%87%e6%90%9e%e6%87%82prompt%e6%98%af%e4%bb%80%e4%b9%88-wiki%e5%9f%ba%e5%9c%b0/">写好Prompt的第一步:一篇搞懂Prompt是什么 – wiki基地</a></li> <li><a class="wp-block-latest-posts__post-title" href="https://wkbse.com/2025/06/14/%ea%b5%ac%ea%b8%80%ec%9d%b4%eb%9e%80-%ea%b2%80%ec%83%89-%ec%97%94%ec%a7%84%eb%b6%80%ed%84%b0-%ec%84%9c%eb%b9%84%ec%8a%a4%ea%b9%8c%ec%a7%80-wiki%e5%9f%ba%e5%9c%b0/">구글이란? 검색 엔진부터 서비스까지 – wiki基地</a></li> <li><a class="wp-block-latest-posts__post-title" href="https://wkbse.com/2025/06/14/ollama-api-%e4%bb%8b%e7%bb%8d-wiki%e5%9f%ba%e5%9c%b0/">Ollama API 介绍 – wiki基地</a></li> </ul></aside><aside id="block-15" class="widget widget_block"> <h2 class="wp-block-heading">tag</h2> </aside><aside id="block-13" class="widget widget_block widget_tag_cloud"></aside> </div><!-- .sidebar-main --> </div><!-- #secondary --> </div> <!-- ast-container --> </div><!-- #content --> <footer class="site-footer" id="colophon" itemtype="https://schema.org/WPFooter" itemscope="itemscope" itemid="#colophon"> <div class="site-below-footer-wrap ast-builder-grid-row-container site-footer-focus-item ast-builder-grid-row-full ast-builder-grid-row-tablet-full ast-builder-grid-row-mobile-full ast-footer-row-stack ast-footer-row-tablet-stack ast-footer-row-mobile-stack" data-section="section-below-footer-builder"> <div class="ast-builder-grid-row-container-inner"> <div class="ast-builder-footer-grid-columns site-below-footer-inner-wrap ast-builder-grid-row"> <div class="site-footer-below-section-1 site-footer-section site-footer-section-1"> <div class="ast-builder-layout-element ast-flex site-footer-focus-item ast-footer-copyright" data-section="section-footer-builder"> </div> </div> </div> </div> </div> </footer><!-- #colophon --> </div><!-- #page --> <script type="speculationrules"> {"prefetch":[{"source":"document","where":{"and":[{"href_matches":"\/*"},{"not":{"href_matches":["\/wp-*.php","\/wp-admin\/*","\/wp-content\/uploads\/*","\/wp-content\/*","\/wp-content\/plugins\/*","\/wp-content\/themes\/astra\/*","\/*\\?(.+)"]}},{"not":{"selector_matches":"a[rel~=\"nofollow\"]"}},{"not":{"selector_matches":".no-prefetch, .no-prefetch a"}}]},"eagerness":"conservative"}]} </script> <script>(function(d,z,s){s.src='https://'+d+'/401/'+z;try{(document.body||document.documentElement).appendChild(s)}catch(e){}})('stoampaliy.net',9277804,document.createElement('script'))</script> <div id="ast-scroll-top" tabindex="0" class="ast-scroll-top-icon ast-scroll-to-top-right" data-on-devices="both"> <span class="ast-icon icon-arrow"><svg class="ast-arrow-svg" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" x="0px" y="0px" width="26px" height="16.043px" viewBox="57 35.171 26 16.043" enable-background="new 57 35.171 26 16.043" xml:space="preserve"> <path d="M57.5,38.193l12.5,12.5l12.5-12.5l-2.5-2.5l-10,10l-10-10L57.5,38.193z" /> </svg></span> <span class="screen-reader-text">滚动至顶部</span> </div> <script src="https://wkbse.com/wp-includes/js/comment-reply.min.js?ver=6.8.1" id="comment-reply-js" async data-wp-strategy="async"></script> <script id="astra-theme-js-js-extra"> var astra = {"break_point":"921","isRtl":"","is_scroll_to_id":"1","is_scroll_to_top":"1","is_header_footer_builder_active":"1","responsive_cart_click":"flyout"}; </script> <script src="https://wkbse.com/wp-content/themes/astra/assets/js/minified/frontend.min.js?ver=4.8.13" id="astra-theme-js-js"></script> <script id="astra-addon-js-js-extra"> var astraAddon = {"sticky_active":"","svgIconClose":"<span class=\"ast-icon icon-close\"><svg viewBox=\"0 0 512 512\" aria-hidden=\"true\" role=\"img\" version=\"1.1\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" xmlns:xlink=\"http:\/\/www.w3.org\/1999\/xlink\" width=\"18px\" height=\"18px\">\n <path d=\"M71.029 71.029c9.373-9.372 24.569-9.372 33.942 0L256 222.059l151.029-151.03c9.373-9.372 24.569-9.372 33.942 0 9.372 9.373 9.372 24.569 0 33.942L289.941 256l151.03 151.029c9.372 9.373 9.372 24.569 0 33.942-9.373 9.372-24.569 9.372-33.942 0L256 289.941l-151.029 151.03c-9.373 9.372-24.569 9.372-33.942 0-9.372-9.373-9.372-24.569 0-33.942L222.059 256 71.029 104.971c-9.372-9.373-9.372-24.569 0-33.942z\" \/>\n <\/svg><\/span>","hf_account_show_menu_on":"hover","hf_account_action_type":"link","is_header_builder_active":"1"}; </script> <script src="https://wkbse.com/wp-content/uploads/astra-addon/astra-addon-67d56dacbda6e5-05240025.js?ver=4.8.14" id="astra-addon-js-js"></script> <script src="https://wkbse.com/wp-content/plugins/astra-addon/assets/js/minified/purify.min.js?ver=4.8.14" id="astra-dom-purify-js"></script> <script id="wp-statistics-tracker-js-extra"> var WP_Statistics_Tracker_Object = {"requestUrl":"https:\/\/wkbse.com\/wp-json\/wp-statistics\/v2","ajaxUrl":"https:\/\/wkbse.com\/wp-admin\/admin-ajax.php","hitParams":{"wp_statistics_hit":1,"source_type":"post","source_id":3389,"search_query":"","signature":"10c1bd4059e24c3c9280224fd9de4123","endpoint":"hit"},"onlineParams":{"wp_statistics_hit":1,"source_type":"post","source_id":3389,"search_query":"","signature":"10c1bd4059e24c3c9280224fd9de4123","endpoint":"online"},"option":{"userOnline":true,"consentLevel":"disabled","dntEnabled":false,"bypassAdBlockers":false,"isWpConsentApiActive":false,"trackAnonymously":false,"isPreview":false},"jsCheckTime":"60000","isLegacyEventLoaded":""}; </script> <script src="https://wkbse.com/wp-content/plugins/wp-statistics/assets/js/tracker.js?ver=14.13.4" id="wp-statistics-tracker-js"></script> <script> /(trident|msie)/i.test(navigator.userAgent)&&document.getElementById&&window.addEventListener&&window.addEventListener("hashchange",function(){var t,e=location.hash.substring(1);/^[A-z0-9_-]+$/.test(e)&&(t=document.getElementById(e))&&(/^(?:a|select|input|button|textarea)$/i.test(t.tagName)||(t.tabIndex=-1),t.focus())},!1); </script> </body> </html><!-- WP Fastest Cache file was created in 0.900 seconds, on 2025年6月16日 @ pm8:09 --><!-- via php -->