我正在围绕 CLI 制作一个 Ruby 包装器。我找到了一个简洁的方法Open3.capture3
(内部使用Open3.popen3
),它可以让我执行命令并捕获标准输出、标准错误和退出代码。
我想要检测的一件事是是否找不到 CLI 可执行文件(并为此引发特殊错误)。我知道 UNIX shell127
在找不到命令时会给出退出代码。当我$ foo
在 bash 中执行时,我得到-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
?