Ruby の Kernel#exec は 2 つの呼び出し方があって、一つは Kernel#exec(program, *args)
でもう一つは Kernel#exec(command)
だったりする。どちらも似たような動きをするかと思いきや、前者はシェルを経由せずに動作して、後者は経由して動作する。
実はこの違いが原因で jenkins.rb が gentoo のような shell によるラッパー経由で起動する java コマンドを使う時に上手く動かないという現象があったので pull request して直したのであった。
上記の件とは別に JRuby の Kernel#exec も何か怪しい挙動をしたりしていて、問題を分けるのにちょっと混乱したんだけど、ひとまず jenkins.rb の方は直ったみたいなので gentoo の人も安心して jenkins プラグイン開発に勤しんでください。
後者もシェルのメタキャラクタが含まれなければシェルを経由しないです。まあ、含まれると分かっているケースなのかもしれませんが。<br><br>確実にシェルを経由したければ<br>exec "/bin/sh", "-c", args.shelljoin<br>ですね。
むむむ、勉強になります。<br>ちょうど今日は asakusa.rb なので、もう少し深追いしてみます。
@workdirや@warにメタキャラクタが含まれる場合にむしろうまく動かなさそう。<br>それにシェルスクリプトでも+xされてて正しいshebangがあればexec(*args)でも実行できるはず。Linuxではshebangはカーネルモジュールで解釈されてるので。
今日 @nahi さんと深追いしたんですが、<br>1. JRuby で<br>2. Kernel.exec(Array) で<br>3. 実行対象が symlink で<br>4. symlink 先が渡されたコマンドを解釈できない<br>の時に動かないというバグだったようです。3 の部分を上手く展開できないのは JRuby の問題だろうということで後でバグ報告予定。