【问题标题】:How capture all bash output (from inside a script) into variable and then turn output back to stdout?如何将所有 bash 输出(从脚本内部)捕获到变量中,然后将输出转回标准输出?
【发布时间】:2019-08-14 18:41:32
【问题描述】:

我有一个 bash 脚本,它运行许多其他命令(例如 docker)。我希望脚本能够将所有输出捕获到一个变量中,然后在最后回显一个自定义返回。

例子:

#!/usr/bin/env bash
set -euo pipefail

# Capture into this (PSEUDO CODE)
declare CapturedOutput
$(Capture Output > CapturedOutput)

# Run some commands like...
docker-compose ... up -d

# Stop capturing (PSEUDO CODE)
$(Stop Capture Output > CapturedOutput)

echo "something"

因此,如果有人像 ./runit.sh 这样调用我的脚本并且 docker 命令有输出,他们不会看到它,而只会看到:

> ./runit.sh

something

【问题讨论】:

  • @LéaGris 这不是重复的。那是从脚本外部捕获输出。我想在里面捕捉它
  • 它只是你想在变量中捕获的docker的输出吗?
  • 你真的要使用CapturedOutput吗?将命令组重定向到 /dev/null 可能就足够了。
  • @DavidC.Rankin 不,我想重定向我在脚本中运行的所有命令的输出

标签: bash shell scripting


【解决方案1】:

将输出捕获到变量中最直接的方法是使用命令替换。您可以轻松地将其包裹在一大块脚本中:

#!/usr/bin/env bash
set -euo pipefail

# To capture standard error, too:
# exec 3>&2 2>&1

CapturedOutput=$(

# Run some commands like...
docker-compose ... up -d

)

# To restore standard error:
# exec 2>&3- 

echo "something"

需要注意的是,用于捕获输出的命令在子 shell 中运行,但我无法想出一种替代方法来捕获到命令本身运行的同一 shell 中的变量中。

【讨论】:

  • 这与将其全部包装在一个函数中会有所不同吗?
  • 我不确定你有什么具体的替代方案,@DonRhummy。您可以docker-compose 和所有其他要在函数中捕获其输出的命令,这可能确实是明智之举,但您仍然需要使用命令替换——在函数内部或函数调用中——将输出捕获到变量中。
  • 不幸的是,这种罪恶行不通。我 认为 因为它现在位于子外壳中,所以 docker 无法挂载卷。我收到错误:ERROR: for redis Cannot start service redis: error while creating mount source path '/host_mnt/c/Users/myname/redis-test/customstartup.sh': mkdir /host_mnt/c: file exists
  • @DonRhummy,我相信您的特定脚本(如我所描述的那样使用命令替换编写)并没有成功地完成您希望它完成的工作。但是,完全不清楚为什么在子 shell 中运行命令会直接导致该消息中描述的特定错误,事实上我发现前景值得怀疑。使用子 shell 的问题主要围绕(不)将信息传递回父 shell,尤其是在子 shell 中执行的重定向和 shell 变量修改不影响父 shell。
  • 我知道,但是当我不在子shell中运行它时它可以工作,但是当我将它放入子shell时它会抛出错误
【解决方案2】:

我想你想看看 bash 手册页上的“命令替换”部分。

要将问题中的伪代码转换为 bash 的格式,例如:

CapturedOutput=$(docker-compose ... up -d)
CapturedOutput=$CapturedOutput $(docker-compose ... up -d)
...

【讨论】:

    猜你喜欢
    • 2018-01-10
    • 2019-04-10
    • 2013-01-26
    • 2011-07-05
    • 2012-08-16
    • 1970-01-01
    • 2021-06-24
    • 1970-01-01
    • 2011-10-13
    相关资源
    最近更新 更多