首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在同一个shell进程中运行多个命令

在同一个shell进程中运行多个命令
EN

Stack Overflow用户
提问于 2017-06-15 20:41:37
回答 2查看 2.3K关注 0票数 3

我试图通过Ruby运行一系列命令,并捕获stdinstdoutstderr和exitstatus。

代码语言:javascript
运行
复制
require "open3"
require "pp"

command_list = [
  "export MY_ENV_VAR=foobar",
  "printenv MY_ENV_VAR"
]

executed_commands = []
result = nil

command_list.each do |command|
  stdout, stderr, status = Open3.capture3(command)
  result = status.exitstatus
  executed_commands << [command, stdout, stderr, result]
  break if result != 0
end

pp executed_commands
puts "exited with #{result} exit status."

此进程以非零状态退出,指示printenv MY_ENV_VAR命令失败,且命令不在同一进程中运行。

如何在单个shell进程中执行一系列命令,记录stdin**,** stdout**,** stderr 以及每个命令的退出状态?

EN

Stack Overflow用户

发布于 2017-06-15 20:46:57

运行一系列命令的代码很好。问题是您设置的环境变量不正确。子进程不能像您尝试的那样设置其父进程的环境。子进程确实继承了其父进程的环境,因此这里有一种修复代码的方法:

代码语言:javascript
运行
复制
require "open3"
require "pp"

ENV['MY_ENV_VAR'] = 'hi'

command_list = [
  "printenv MY_ENV_VAR"
]

executed_commands = []
result = nil

command_list.each do |command|
  stdout, stderr, status = Open3.capture3(command)
  result = status.exitstatus
  executed_commands << [command, stdout, stderr, result]
  break if result != 0
end

pp executed_commands
puts "exited with #{result} exit status."

当我在Linux上使用Ruby2.3.1运行这个程序时,结果是:

代码语言:javascript
运行
复制
[["printenv MY_ENV_VAR", "hi\n", "", 0]]
exited with 0 exit status.

现在,如果您想在不修改您自己流程的环境的情况下将一个环境变量传递给子进程,请参阅Open3.capture3参数的文档

https://ruby-doc.org/stdlib/libdoc/open3/rdoc/Open3.html#method-c-capture3

票数 2
EN
查看全部 2 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44576683

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档