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 を呼び出しました。