2011-05-18 52 views
1

我寫了一個bash包裝器來進行各種設置步驟的ruby。在bash中編寫一個腳本解釋器

最基本的版本是,

#!/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

這可能嗎?

documentation聲稱它不是。

請注意,解釋器本身可能不是解釋器腳本。

但我不明白爲什麼不。有沒有人有任何想法來解決這個問題?

+0

您鏈接並引用的文檔是針對NetBSD而不是Linux的。 – Hasturkun 2011-05-18 22:56:37

+0

確實如此,但在linux上也是如此。 http://www.kernel.org/doc/man-pages/online/pages/man2/execve.2.html >解釋器必須是可執行文件的有效路徑名,它本身不是腳本。 – diedthreetimes 2011-05-18 23:07:42

回答

9

嘗試使用/usr/bin/env調用包裝。實際上,使用/usr/bin/env ruby來執行Ruby腳本是一種很好的做法,因爲您不必硬編碼到ruby二進制文件的路徑,所以這不是不自然的。

$ cat ruby_wrapper.sh 
#!/bin/bash 
exec ruby "[email protected]" 

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

$ ./wrapped.rb 
hello world 

另外,作爲附註,請參閱我在包裝腳本中如何使用exec。這將允許ruby解釋器接管包裝腳本的過程,而不是作爲腳本的子過程運行。這使得包裝函數對調用者透明(例如,信號將直接傳遞給ruby而不是bash)。

+0

完美,謝謝!我讀了關於用於可移植性的/ usr/bin/env技巧,但沒有意識到它會繞過這個限制。 – diedthreetimes 2011-05-18 23:04:28