在 Bash 中捕获 stdout 和 stderr [重复]

2024-01-22

我知道这个语法

var=`myscript.sh`

or

var=$(myscript.sh)

将捕获结果(stdout) of myscript.sh into var。我可以重定向stderr into stdout如果我想同时捕获两者。如何将它们每个保存到单独的变量中?

我的用例是如果返回代码非零我想回显stderr并抑制其他情况。可能还有其他方法可以做到这一点,但如果实际上可能的话,这种方法似乎会起作用。


有一种非常丑陋的捕捉方式stderr and stdout在没有临时文件的两个单独的变量中(如果您喜欢管道),使用流程替代 http://www.gnu.org/software/bash/manual/bashref.html#Process-Substitution, source, and declare适当地。我会呼叫你的命令banana。您可以使用函数来模拟这样的命令:

banana() {
    echo "banana to stdout"
    echo >&2 "banana to stderr"
}

我假设你想要标准输出banana在变量中bout和标准误banana在变量中berr。这是实现这一目标的魔法(仅限 Bash≥4):

. <({ berr=$({ bout=$(banana); } 2>&1; declare -p bout >&2); declare -p berr; } 2>&1)

那么,这里发生了什么?

让我们从最里面的术语开始:

bout=$(banana)

这只是分配给的标准方法bout标准输出banana,终端上显示的标准错误。

Then:

{ bout=$(banana); } 2>&1

仍将分配给bout的标准输出banana,但是标准错误banana通过 stdout 显示在终端上(感谢重定向2>&1.

Then:

{ bout=$(banana); } 2>&1; declare -p bout >&2

将按照上面的方式执行,但也会在终端上显示(通过 stderr)的内容boutdeclare内置:这将很快被重用。

Then:

berr=$({ bout=$(banana); } 2>&1; declare -p bout >&2); declare -p berr

将分配给berr标准错误banana并显示内容berr with declare.

此时,您的终端屏幕上将显示:

declare -- bout="banana to stdout"
declare -- berr="banana to stderr"

与线

declare -- bout="banana to stdout"

通过 stderr 显示。

最终重定向:

{ berr=$({ bout=$(banana); } 2>&1; declare -p bout >&2); declare -p berr; } 2>&1

将通过标准输出显示先前的内容。

最后,我们使用一个流程替代 http://www.gnu.org/software/bash/manual/bashref.html#Process-Substitution to source这些行的内容。


您提到了命令的返回码。改变banana to:

banana() {
    echo "banana to stdout"
    echo >&2 "banana to stderr"
    return 42
}

我们还将获得以下返回码banana在变量中bret像这样:

. <({ berr=$({ bout=$(banana); bret=$?; } 2>&1; declare -p bout bret >&2); declare -p berr; } 2>&1)

您无需采购和流程替代即可使用eval也是(它也适用于 Bash

eval "$({ berr=$({ bout=$(banana); bret=$?; } 2>&1; declare -p bout bret >&2); declare -p berr; } 2>&1)"

而这一切都是安全的,因为我们唯一拥有的东西sourceing or evaling 获得自declare -p并且总是会被正确地转义。


当然,如果您想要数组中的输出(例如,使用mapfile,如果您使用的是 Bash≥4 — 否则替换mapfile with a whileread循环),适应很简单。

例如:

banana() {
    printf 'banana to stdout %d\n' {1..10}
    echo >&2 'banana to stderr'
    return 42
}

. <({ berr=$({ mapfile -t bout < <(banana); } 2>&1; declare -p bout >&2); declare -p berr; } 2>&1)

并带有返回码:

. <({ berr=$({ mapfile -t bout< <(banana; bret=$?; declare -p bret >&3); } 3>&2 2>&1; declare -p bout >&2); declare -p berr; } 2>&1)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Bash 中捕获 stdout 和 stderr [重复] 的相关文章

  • 自动检测log4j静态初始化错误的方法

    请注意 这更像是 Bash 问题 而不是 Java 问题 请参阅下面的注释 在每个类中配置log4j时 我们执行以下操作 public class Example private static final Logger log Logger
  • bash 自动完成:添加可能完成的描述

    是否可以使 bash 自动完成功能看起来像 Cisco IOS shell 中一样 我的意思是为每个完成添加简短的描述 如下所示 telnet 10 10 10 TAB Pressed 10 10 10 10 routerA 10 10 1
  • 在Python中通过sys.stdout写入unicode字符串

    暂时假设一个人无法使用print 从而享受自动编码检测的好处 所以这给我们留下了sys stdout 然而 sys stdout太蠢了不做任何合理的编码 http bugs python org issue4947 现在人们阅读 Pytho
  • 从 Ruby 运行 shell 命令:在显示输出时捕获输出?

    我有个问题 我想从另一个 ruby 脚本运行一个 ruby 脚本并捕获它的输出信息 同时让它也输出到屏幕上 runner usr bin env ruby print Enter your password password gets ch
  • 将 JSON 数组转换为 bash 数组并保留空格

    我想将 JSON 文件转换为 bash 字符串数组 稍后我可以对其进行迭代 我的JSON结构如下 USERID TMCCP CREATED DATE 31 01 2020 17 52 USERID TMCCP CREATED DATE 31
  • 将数组传递给函数名称冲突

    Specs GNU bash 版本 3 1 17 无法升级 Premise 我一直在摆弄数组 我想知道是否有任何方法可以让函数的本地变量与所述函数外部的数组同名 Example 在下面的示例中 我将尝试显示该问题 Working bin b
  • 如何替换“docker run”命令中的变量值

    我正在使用 bash 脚本并尝试分配指纹值 如下所示 export FINGERPRINT D0 19 C5 80 42 66 56 AC 6F docker run rm i v var run docker sock var run d
  • TCL 脚本 - exec 将文本刷新到我的标准输出

    我怎样才能 冲洗 stdout of the exec命令到我的脚本stdout没有 等待 结果执行返回 例如在下面的脚本中我想要git clone输出立即出现在我的脚本上下文中 usr bin tclsh git outputs prog
  • 我的 unix 脚本出了什么问题

    bin bash while echo n Player s name read name name ZZZ do searchresult grep name playername if searchresult 0 then echo
  • 设置 Pyenv 的路径

    我正在尝试在我的服务器中设置 Pyenv 的加载路径 bashrc file 我正在关注这个tutorial https realpython com intro to pyenv 它要求我们在哪里设置pyenv到加载路径 然而 在我的 b
  • Inotify linux 监视子目录

    是否可以以这种模式监视目录 storage data usernames Download gt storage data Download 我需要监视每个用户的下载文件夹中是否进行了更改 也许我需要创建所有路径的列表 将其放入数组中 并在
  • apt-get install tzdata 非交互式

    当我尝试 apt get install y tzdata 将显示用于选择时区的命令行选项 我试图在脚本中使用它来进行一些设置 如何在没有用户输入的情况下使 apt get 运行 我知道重新配置 tzdata 我可以做 echo Ameri
  • 规范化 solaris 上的路径名

    在 GNU 系统上我只会使用readlink f SOME PATH 但 Solaris 没有 readlink 我更喜欢在 bash 中运行良好的程序 但如果需要的话其他程序也可以 Edit 到目前为止 我想到的最好的方法是使用 cd 和
  • 将“npm run start”的输出写入文件

    我想捕获的输出npm run start在一个文件中 我遇到了大量错误 我想更好地控制如何筛选输出 当我尝试时 npm run start gt log txt 我得到一个非常简短的文件 8 行 其结尾为 34m 39m 90m wdm 3
  • 使用 php 脚本的电子邮件管道

    你好 我想将所有电子邮件 到达我的收件箱 转发到 php 脚本并检索电子邮件内容并将其保存在文件中 因此 我正确地添加了具有管道路径的电子邮件转发器 转发地址 电子邮件受保护 cdn cgi l email protection 管道到程序
  • 在 Linux 中禁用历史记录 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 要在 Linux 环境中禁用历史记录 我执行了以下命令 export HISTFILESIZE 0 export HISTSIZE 0 u
  • 在bash中,是否有相当于“错误消息”的东西

    在 perl 中 您可以使用错误消息退出die some msg bash 中是否有等效的单个命令 现在 我正在使用命令来实现这一点 echo some msg exit 1 你可以很容易地自己推出 die echo 1 gt 2 exit
  • Bash 解析和 shell 扩展

    我对 bash 解析输入和执行扩展的方式感到困惑 对于输入来说 hello world 作为 bash 中的参数传递给显示其输入内容的脚本 我不太确定 Bash 如何解析它 Example var hello world displaywh
  • 通过特定分隔符删除字符串

    我的文件中有几列 其中第二列有 分隔符 我想删除第二列中的第一个 第三个和第四个字符串 并将第二个字符串留在该列中 但我有正常的分隔符空间 所以我不知道 input 22 16050075 A G 16050075 A G 22 16050
  • 如何在 Linux 中编写文本模式 GUI? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 当我编写脚本 程序时 我经常想弹出一个简单的文本 gui 来提示输入 我该怎么做 例如 来自 Shel

随机推荐

  • Akka.Net 发送巨大消息(最大帧大小)

    我有一个关于增加最大帧大小和发送 接收缓冲区大小值的问题 他们的高度有限制吗 我将大量数据传递到系统中 比如 20mb 然后用于计算一些结果并返回 将上述参数设置为 100mb 会导致消息被丢弃 在这种情况发生之前我可以通过的最大块大约是
  • 如何在 LDAP 中按 DN 进行搜索?

    我正在从 LDAP 中提取有关用户的信息 这包括 directReports 它是完整的CN cnBlah OU ouBlah DC dcBlah形式 我正在尝试再次查找有关该记者的信息 到目前为止 我能够真正找到所述用户的唯一方法是打破C
  • 关于“==”运算符行为的解释

    在下面的非常简单的示例中 我无法理解 运算符的行为 A lt c 10 20 10 10 20 30 B lt c 40 50 60 70 80 90 df lt data frame A B df df A c 10 20 it retu
  • mongodb ISODate 问题

    我正在使用java IDE是eclipse 在mongodb上查询 下面是我的java代码 DBObject query new BasicDBObject ObjectId id new ObjectId 529f280b90ee58cb
  • SpringBoot:配置生产环境与开发环境

    我在使用 SpringBoot 1 5 1 时遇到问题 我已经创建了application properties and application dev properties对于我的开发环境 主要区别在于持久性 在生产中 applicati
  • GruntJS - grunt 构建后错误的图像路径

    Grunt 弄乱了我的缩小 CSS 我不知道为什么以及如何避免它 简而言之 在缩小之前我有一些像这样的背景图像 head image height 380px background url images head1 bg png repea
  • MYSQL排序与主义

    如本文所述question https stackoverflow com questions 41126279 doctrine orm order by annotations object fields并回答 不可能 我提出了一个新问
  • 倒计时栏 Android 示例

    有什么帮助可以在进度条上显示这个简单的倒计时吗 new CountDownTimer 30000 1000 public void onTick long millisUntilFinished mTextField setText sec
  • 内部函数(python)的文档字符串是否必要? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 在Python中 我们用以下划线开头来指定内部函数 私有方法 这些函数是否应该使用文档字符串进行记录 是否必需 我的意思是正式文档 而不是帮助代
  • 无法使用 ssl 与 PDO 连接,但使用 ssl 的 mysqli 可以工作

    我们通过创建证书 更新 my cnf 创建具有正确权限的用户并需要 ssl 重新启动服务来设置带有 SSL 的 mysql 并通过远程连接验证它在服务器端和客户端 通过 mysql 命令行 是否正常工作 我还验证了 PDO 在完全相同的设置
  • 如何绘制参数的不同值的分布?

    我有以下脚本 library ggplot2 values lt c 0 1 0 15 0 2 0 3 0 5 1 1 5 2 2 5 colours lt palette 1 length values p lt ggplot data
  • 如何在 UipageViewController 中快速预加载下一个和上一个视图

    由于经过大量搜索和 RND 以及许多不同的代码实现后 滑动延迟问题尚未解决 因此我猜预加载下一个和上一个视图控制器将解决我的滑动延迟问题 如何在滑动之前加载下一个和上一个视图 经过长时间的 rnd 和搜索后没有找到解决方案 在显示可见控制器
  • 如何添加 favicon gatsby-config.js?

    所以我尝试在我的博客中添加图标 代码如下 在我的 gatsby config js 中 module exports siteMetadata title Chatbiz Blog plugins gatsby plugin react h
  • 是否有任何解决方法可以禁用 Google 地球插件的“缩放时自动倾斜”功能?

    最新版本的 Google 地球附带了一项名为 缩放时自动倾斜 的功能 如果启用 当您放大到靠近地面时 Google 地球会自动将相机向地平线倾斜 可以从 GUI 中禁用此功能 首选项 gt 导航选项卡 不幸的是 到目前为止我还没有找到一种方
  • 使用 PowerShell 将文件上传到 SFTP

    我们被要求设置从我们的一台服务器到 SFTP 站点的自动上传 每个星期一早上都会有一个文件从数据库导出到文件管理器 他们希望在星期二将该文件上传到 SFTP 我们当前使用的身份验证方法是用户名和密码 我相信也可以选择拥有密钥文件 但选择了用
  • 如何在 MongoDB 查询中使用正则表达式变量

    我想根据我构造的正则表达式查询 MongoDB 文档 例如 我构建了一个简单的正则表达式 如下所示 它是 Nodejs 中随机字母和随机数字的组合 var randnum Math floor Math random 10 1 var al
  • DropDownList 的行为不符合预期

    我的 DropDownListFor 遇到问题 希望您能帮助我 我猜这是你要么知道要么不知道的事情之一 问题是我的数据库中有一个国家 地区表 其中包含国家 地区列表 我希望从下拉列表中获得的行为是在地址表中创建一个外键引用 指向下拉列表中选
  • 使用异步而不等待?

    考虑使用异步而不等待 https stackoverflow com questions 12016567 using async without await 认为您可能误解了 async 的作用 警告是 完全正确 如果您将方法标记为异步但
  • Scala 中的列表和元组

    来自 Martin Odersky 的 Scala 编程 一书 另一个有用的容器对象是元组 像列表一样 元组是不可变的 但与列表不同的是 元组可以包含不同类型的元素 但我可以拥有 val oneTwoThreee List 1 2 Thir
  • 在 Bash 中捕获 stdout 和 stderr [重复]

    这个问题在这里已经有答案了 我知道这个语法 var myscript sh or var myscript sh 将捕获结果 stdout of myscript sh into var 我可以重定向stderr into stdout如果