2010-08-04 202 views
4

我想在ruby腳本中更改當前shell的pwd。所以:在ruby腳本中執行cd命令

> pwd 
/tmp 
> ruby cdscript.rb 
> pwd 
/usr/bin 

這是我現在所擁有的代碼:

exec('cd /usr/bin') 

不幸的是,CD是一個內置命令。所以:

`exec': No such file or directory - cd (Errno:ENOENT) 

對此的任何解決方法?


沒辦法讓它在紅寶石本身工作,所以我換了齒輪。我修改了腳本以輸出目標目錄路徑,然後在.bashrc中定義了一個函數,該函數可以通過腳本傳遞參數,然後cd到正確的目錄。沒有像我所希望的那樣自成一體,但它做到了這一點。

感謝您的回覆,夥計們。

+0

你可以試試'光盤的/ usr/bin'或系統(「CD的/ usr/bin中」)在你的Ruby代碼,但這隻會更換新外殼的當前目錄(這是子進程作爲shell的孩子的紅寶石),但是這是毫無意義的,因爲我不能在* inx系統中更改父進程的目錄。 – jcubic 2010-08-04 22:27:54

+0

殼解決方案如何?就像在bash配置文件中放入_alias usb =「cd/usr/bin」_,然後在shell中輸入_usb_一樣。 – 2010-08-04 22:28:21

+0

有一堆代碼邏輯到達執行部分(它實際上不是一個靜態路徑)。這只是一個簡單的例子,所以別名不是最優的。 – 2010-08-04 22:30:13

回答

3

正如已經指出的其他答案,你可以改變ruby腳本中的pwd,但它隻影響子進程(你的ruby腳本)。父進程的密碼不能從子進程改變。

一種解決方法可以是,具有腳本輸出的外殼命令(一個或多個)執行並調用它在反引號(即,外殼執行腳本並取其作爲命令來執行輸出)

myscript.rb :

# … fancy code to build somepath … 
puts "cd #{somepath}" 

叫它:

`ruby myscript.rb` 

使它成爲一個簡單的命令通過使用別名:

alias myscript='`ruby /path/to/myscript.rb`' 

不幸的是,這種方式不能讓腳本向用戶輸出文本,因爲腳本輸出的任何文本都是由shell執行的(儘管這裏也有更多的解決方法)。

12

Dir.chdir("/usr/bin")將更改ruby腳本中的pwd,但這不會在腳本在子進程中執行時更改shell的PWD。

+1

這不是問題。 – sepp2k 2010-08-04 22:24:04

+3

取決於你如何看待它,他在試圖執行exec()'cd'時會遇到問題,它將(也)不能工作。如果他問道爲什麼Dir.chdir()不工作,那麼這個答案就完全不相關。無論如何,編輯是爲了完整。 – 2010-08-04 22:28:38

+2

@ sepp2k:這是我正在尋找的答案,它的工作非常好,感謝溫科。 – Dorian 2012-03-26 16:33:05

8

您將無法更改shell的工作目錄。

當它執行ruby時,它會分叉,所以你會得到一個新的工作目錄。

0

您無法更改在ruby腳本(或任何其他類型的應用程序)中調用您的shell的工作目錄(或該環境變量)。唯一可以更改當前shell的pwd的命令是shell內置函數。

6

在尋找同樣的事情時遇到了這個問題。

我能夠通過在反引號內運行多個語句來解決這個問題。

'cd #{path} && <statement> && cd ..' 
0

你可以嘗試使用system而不是exec。 它適合我。

system("cd #{new_path} && <statement> && cd #{original_path}")