【发布时间】:2014-11-20 07:47:58
【问题描述】:
我正在围绕 CLI 制作一个 Ruby 包装器。我发现了一个简洁的方法Open3.capture3(内部使用Open3.popen3),它可以让我执行命令并捕获标准输出、标准错误和退出代码。
我想要检测的一件事是是否找不到 CLI 可执行文件(并为此引发一个特殊错误)。我知道 UNIX shell 在找不到命令时会给出退出代码127。
当我在 bash 中执行$ foo 时,我得到-bash: foo: command not found,这正是我想要显示的错误消息。
考虑到所有这些,我编写了这样的代码:
require "open3"
stdout, stderr, status = Open3.capture3(command)
case status.exitstatus
when 0
return stdout
when 1, 127
raise MyError, stderr
end
但是,当我使用command = "foo" 运行它时,我得到一个错误:
Errno::ENOENT: No such file or directory - foo
/Users/janko/.rbenv/versions/2.1.3/lib/ruby/2.1.0/open3.rb:193:in `spawn'
/Users/janko/.rbenv/versions/2.1.3/lib/ruby/2.1.0/open3.rb:193:in `popen_run'
/Users/janko/.rbenv/versions/2.1.3/lib/ruby/2.1.0/open3.rb:93:in `popen3'
/Users/janko/.rbenv/versions/2.1.3/lib/ruby/2.1.0/open3.rb:252:in `capture3'
为什么会出现这个错误?我以为 Open3.capture3 应该直接在 shell 中执行该命令,为什么我没有得到正常的 STDERR 和退出代码 127?
【问题讨论】: