Techioz Blog

Linux では Open3.popen3 がコマンドをラップしているのに MacOS ではラップしていないのはなぜですか? [閉まっている]

概要

このコード

Open3.popen3('mydir/myscript')

Linux では sh -c でラップされていますが、MacOS ではラップされていません。なぜ?

ルビー3.3

解決策

あなたの結果を再現することはできません。

Ruby がシェルを使用するかどうかに関するルールは、ドキュメントで詳しく説明されています。

mydir/myscript とは正確には何なのか、また、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

2 つの出力は、些細な詳細が異なるだけのようです。一方のプロセスに存在せず、もう一方のプロセスには存在しない余分なプロセスを見つけることができません。どちらの場合も、Ruby はシェルを使用せず、実行可能ファイルを直接呼び出しました (./test.sh は文字列ですが、シェルの予約語や組み込み語で始まっておらず、メタキャラクターも含まれていません)。その後、実行可能ファイル内のシバン行により、OS が /bin/bash を呼び出しました。