为什么 Open3.popen3 在 Linux 上将我的命令包装在 `sh -c` 中,但在 Macos 上却不然?

问题描述 投票:0回答:1

这段代码

Open3.popen3('mydir/myscript')
在 Linux 上,

被包裹在

sh -c
中,但在 Macos 上则不然。为什么?

红宝石3.3

ruby linux shell popen3
1个回答
0
投票

我无法复制你的结果。


文档中明确了 Ruby 何时使用 shell 的规则:

单个必需参数是以下之一:

  • command_line
    如果它是一个字符串,并且它以 shell 保留字或特殊内置字符开头,或者它包含一个或多个元字符。
  • 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
© www.soinside.com 2019 - 2024. All rights reserved.