1

さまざまなセットアップ手順を実行するbashラッパーをrubyに作成しました。

最も基本的なバージョンは、

   #!/bin/bash 
   #   ruby_wrapper.sh
   ruby

今、私はこのラッパーを通常のルビーのように使用できるようにしたいと思います!具体的には、この「インタプリタ」を使用した.rbファイルを作成したいと思います。

   #!/path/to/ruby_wrapper.sh
   #  my_file.rb
   puts "hello world"

$ ./my_file.rbだから私は代わりにできるようになりたい$ ruby_wrapper.sh my_file.rb

これは可能ですか?

ドキュメントはそうではないと主張しています。

インタプリタ自体がインタプリタスクリプトではない場合があることに注意してください。

しかし、なぜそうなのかわかりません。誰かがこれを回避するためのアイデアを持っていますか?

4

1 に答える 1

9

でラッパーを呼び出してみてください/usr/bin/env/usr/bin/env rubyバイナリへのパスをハードコーディングする必要がないため、Rubyスクリプトを実行することは実際には良い習慣ですruby。したがって、これは不自然ではありません。

$ cat ruby_wrapper.sh 
#!/bin/bash
exec ruby "$@"

$ cat wrapped.rb 
#!/usr/bin/env /tmp/ruby_wrapper.sh
puts "hello world"

$ ./wrapped.rb 
hello world

execまた、補足として、ラッパースクリプトでどのように使用したかを確認してください。これにより、rubyインタープリターは、スクリプトの子プロセスとして実行するのではなく、ラッパースクリプトのプロセスを引き継ぐことができます。これにより、ラッパーは呼び出し元に対して透過的になります(たとえば、シグナルはbashではなくrubyに直接配信されます)。

于 2011-05-18T23:01:03.137 に答える