这段代码
Open3.popen3('mydir/myscript')
在 Linux 上,被包裹在
sh -c
中,但在 Macos 上则不然。为什么?
红宝石3.3
我无法复制你的结果。
文档中明确了 Ruby 何时使用 shell 的规则:
单个必需参数是以下之一:
如果它是一个字符串,并且它以 shell 保留字或特殊内置字符开头,或者它包含一个或多个元字符。command_line
否则。exe_path
如果不了解
mydir/myscript
到底是什么以及它是否在两个系统上同等地触发第一个条件,就不可能进一步回答。
但是,很容易表明,在一般情况下,您描述的场景不会发生(或者至少,我无法引出它)。使用以下内容进行测试:
在
test.rb
:
#!/usr/bin/env ruby
require 'open3'
i, o, e, t = Open3.popen3('./test.sh')
puts o.read
在
test.sh
:
#!/bin/bash
echo -n " PID: "
ps -o command= -p $$
echo -n " PPID: "
ps -o command= -p $PPID
pppid=$(ps -o ppid= -p $PPID)
echo -n "PPPID: "
ps -o command= -p $pppid
OSX 上
ruby test.rb
的输出(在 bash 中):
PID: /bin/bash ./test.sh
PPID: ruby test.rb
PPPID: -bash --posix
Ubuntu 上
ruby test.rb
的输出(在 bash 中):
PID: /bin/bash ./test.sh
PPID: ruby test.rb
PPPID: -bash