2012-08-13 32 views
3

摘要:在Windows機器上,如何使Bourne shell成爲活動的Ruby shell?這是我想發生什麼:如何在Windows下使用Bourne shell作爲活動的Ruby shell

irb> exec('echo $SHELL') 
/bin/sh 

實際的輸出是:

irb> exec('echo $SHELL') 
$SHELL 

這是,如果我嘗試在cmd.exe手動運行該命令會發生什麼。根據Ruby文檔,它看起來像exec調用檢查$RUBYSHELL$COMSPEC(按此順序?)。我已經嘗試將$RUBYSHELL設置爲"C:\Program Files (x86)\Git\bin\sh.exe",其中我有sh/bin/sh/sh的副本,但其中沒有一個可以正常工作。它看起來基本上完全忽略了RUBYSHELL ...

爲什麼?:我使用了一個Ruby調制解調器,該調用調用exec並將其傳遞給Shellwords.shelljoin。該調用轉義字符,但僅限於Bourne shell。當在Windows'cmd.exe下運行時,它似乎對任何轉義字符都有效,只是忽略它們。結果,該命令沒有被正確解釋。我想解決我的問題的另一種方法是讓我知道是否有更好的跨平臺方式來執行轉義命令序列,但在我看來,如果我可以使我的活動Ruby shell成爲sh,我的問題就會得到解決。

+0

你有沒有嘗試設置Windows本地環境變量'RUBYSHELL'和/或'COMSPEC'(即不是git'sh'變量)?我很確定Windows上的ruby/irb沒有mingw綁定,這意味着它將讀取windows本地環境而不是mingw環境。 – Casper 2012-08-13 15:26:08

+0

@Casper Yep,就是這樣。我只是通過控制面板並設置「RUBYSHELL」等於我想要的。當我在'cmd.exe'或'sh.exe'中運行'env'時,它們顯示正常。 – aardvarkk 2012-08-13 15:27:50

+0

你有沒有考慮覆蓋導致你的問題的方法。一個小小的改變,以改變字符逃離方式更友善的Windows。 – Jato 2012-08-27 01:37:14

回答

0

我會直接執行shell,例如exec('c:\bin\sh')

我要指出的(你可能知道這一點),是Windows環境變量由圍繞它們與百分號訪問:

irb> exec(`echo %SHELL%`) 
+0

是的 - 我知道Windows中的百分號。希望測試能證明它在'sh'中正常工作,因爲該命令實際上會正確地打印出位置,而不是在輸出中看起來像'$ SHELL'的Windows輸出。 – aardvarkk 2012-08-27 14:44:51

0
exec("sh","-c","echo $SHELL") 

這種務實的做法應該是能夠解決的情況下,我的環境工作在不同的運行環境相同,例如:

的mingw32在Windows 7 64位 紅寶石2.1.6p336(2015年4月13日修訂50298)I386-的mingw32] ruby 2.1.6p336

OS-X 10.10.3 紅寶石2.0.0p451(2014年2月24日修訂45167)x86_64的-darwin13.1.0] ruby 2.0.0p451