バグ #889
完了mikutter.rb のshebangが /usr/bin/ruby になっており、他の場所にrubyがあると落ちる
説明
mikutter.rbのshebang( http://dev.mikutter.hachune.net/projects/mikutter/repository/revisions/master/entry/mikutter.rb#L1 )がハードコードになっている事により、Rubyをビルドしてインストールした時などに起動に失敗するようです。
`/usr/bin/env ruby` に変更すればenvコマンドからどこかにインストールされているRubyを探索してくれそうですが、こうしていない理由などはあったりしますか?
(ちなみにこれはdocker_mikutter( https://github.com/Na0ki/docker_mikutter )を触っていた時に気づいたものです)
toshi_a 初音 さんが約8年前に更新
俺もこうなっている理由が分からなかったので追加された当時のコミットを見てみました(995c7507c1ac8e337565305420b3ca4f2e2a7a46)。コミットコメントがないのでわかりません。この粒度でコミットされてたら残っててもどっちみち役に立たなさそう。
たしか /usr/bin/env は、その場所にenvがあるとは限らないのでよくない、という話をきいたことがあったのでちょっと調べてみたところ、Rubyではこう書く場合もあるようです。
http://docs.ruby-lang.org/ja/latest/doc/spec=2frubycmd.html
#!/bin/sh
exec ruby -x "$0" "$@"
#!ruby
p ARGV
puts "Hello, World!"
これはこれでrubyにPATHが通っていることを前提にしているのであんまり良くないように見える。何年か前にこの書き方を見てからこれが最強なんだと思ってたけど調べれば調べるほどわからなくなってきた。どうせ変更するのであれば現代における一番いい方法を使いたいが、答えのない自転車置き場の議論という気もする。
waita Tachibana さんが約8年前に更新
env コマンド使っても結局PATHを通っている事が前提になるし、Rubyドキュメントに記載されている起動方法でも問題無い気がしますが、これだと mikutter.sh になってしまうんですかね?
toshi_a 初音 さんが約8年前に更新
これだと mikutter.sh になってしまうんですかね?
起動ファイルのmikutter.rbをリネームする必要があるのかということですね。それは必要なくて、 ./mikutter.rb という名前でもshebangによってshell scriptとして実行されるだけです。
rubyインタプリタが、渡されたファイルに #!ruby と書かれた行があれば、その行以降のみをパースするという性質を利用しているとのことです。
- envが存在しない環境がある
- envがどこにあるかわからない
- shが存在しない環境があるのでは?(ぐぐっても言及が見当たらない)
ので、私の提案した方法のほうが良いような気はしています。
waita Tachibana さんが約8年前に更新
rubyインタプリタが、渡されたファイルに #!ruby と書かれた行があれば、その行以降のみをパースするという性質を利用しているとのことです。
なるほど理解しました。
shが存在しない環境があるのでは?(ぐぐっても言及が見当たらない)
私も /bin/sh にない環境はあまり聞かないので #889-1 の手法で問題ないように思えます。
強いて言うならばshの$PATHにrubyへのPATHが通ってないようなことが挙げられますが、これはまだ(環境変数だし)回避しやすい物だと思われます。
toshi_a 初音 さんが約8年前に更新
- 担当者 を waita Tachibana にセット
変更してみました。特に問題はないように思えますが。
3.4から分岐していますが、前と全く同じ動きをするわけではないし、前の実装が間違っていたわけでもないので、3.5からの変更としようかなぁと思っています。
waita Tachibana さんが約8年前に更新
私の方でも試してみましたが特に問題は無さそうです。
3.5からの変更としようかなぁと思っています。
はい、それで問題無いかと!