2009-08-06 70 views
9

我想通過system(或使用反引號)從ruby運行命令,但遇到問題。當我嘗試調用一個命令時,shell無法找到它,即使我知道它可以正常工作。例如:如何指定用於ruby系統調用的shell?

`zip` 
>> sh: zip: command not found 

這個問題似乎是紅寶石使用sh外殼,其中$PATH設置不正確,而不是bash,我不知道爲什麼。我的應用程序正在運行的用戶默認設置爲使用bash

有什麼辦法告訴ruby使用bash而不是sh

回答

0

爲什麼不直接指定zip可執行文件的完整路徑。

+0

嗯,我可以。我之所以沒有這樣做,是因爲它是在多種開發環境中開發的,所有這些環境的路徑不一定相同。 – 2009-08-06 17:36:39

+2

像whereis這樣的命令應該總是在路徑中。或在所有發行版/ usr/bin /中的常見位置,這可能是查找可能分散的垃圾箱的好方法。 – 2009-08-06 17:38:34

4

我在猜測Ruby使用system() C函數,它使用/bin/sh。在大多數系統中,/bin/sh只是其他shell的符號鏈接,因此您可以更改爲任何您想要的內容

+0

嗯。/bin/sh確實是符號鏈接...到/ bin/bash!所以出於某種原因,它將PATH設置爲與通常不同的東西? – 2009-08-06 15:16:29

9

據我所知,唯一的方法就是顯式調用shell,

`bash -c zip` 

`#{ ENV['SHELL'] } -c zip` 

或者與系統:system("bash", "-c", command)

但是紅寶石(和紅寶石產生的所有進程)應該繼承父進程的環境,從而有$ PATH設置正確,即使使用另一個外殼。你可能從一個cron作業或初始化腳本或其他類似的地方運行ruby,其中PATH只是設置不正確?

+0

這個調用是從網上進行的,而不是從cron或腳本中進行的。 Apache可以改變我的路徑嗎? – 2009-08-06 15:18:15

+1

這很可能是這種情況。 (很可能apache並沒有改變PATH,但是PATH還沒有被設置爲它的通常值,因爲你的rc文件在調用apache之前沒有被找到)。 – sepp2k 2009-08-06 15:29:31

+0

如果您需要使用多字命令替換'zip',並且不能使用多個參數(例如'IO.popen'),請使用轉義引號,如'system(「bash -c \」cat food \ 「」)' – 2010-10-21 03:44:43