2012-08-16 161 views
2

我已經編寫了一個Ruby腳本來在本地機器上安裝Apache Tomcat。當我運行該腳本,我無法將當前目錄切換到一個我想:更改當前目錄

cmd = "mkdir /usr/java" 
system(cmd) 

cmd = "cp /home/user/Downloads/file.txt /usr/java/" 
system(cmd) 

sleep(2)  

cmd = "cd /usr/java/" 
system(cmd) 

在上面的代碼中mkdircp命令做工精細,但問題是與cd命令。在它之後,我的當前目錄仍爲/,即/usr目錄的父目錄。

更新:使用Dir.chdir()工作,但我在設置JAVA_HOMEPATH變量面臨更大的一個問題。我的代碼是:

cmd = "JAVA_HOME=/usr/java/jdk1.7.0_05" 
system(cmd) 
cmd = "export JAVA_HOME" 
system(cmd) 
cmd = "PATH=$JAVA_HOME/bin:$PATH" 
system(cmd) 
cmd = "export PATH" 
system(cmd) 
+0

與廚師無關。你能刪除這個標籤嗎? – 2012-08-16 21:03:18

回答

1

您可以嘗試使用Dir.chdir '/usr/java/'

另外在IRB會話查看當前文件,你可以做`ls`

+0

你的意思是'system(「ls」)'?在Ruby中沒有內置的'ls'方法... – 2012-08-16 06:29:01

+0

我的意思是在邊上有波浪形的ls('沒有班次)。我很抱歉,我正面臨代碼樣式問題,因爲棧溢出中的代碼假設其中的文本是代碼塊。 雖然系統'ls'也可以正常工作:) – sohaibbbhatti 2012-08-16 06:32:01

+0

啊,我不知道是什麼,現在我明白了。這是一個很好的觀點 - 這是一種從irb內部獲取目錄列表的非常簡單的方法,對提問者可能有用。 – 2012-08-16 06:36:41

4

system()每個呼叫從完全獨立運行其他;他們之間沒有共享隱藏的shell會話。 (我很確定,實際上,他們每個都在自己的進程中運行 - cd有效,但它不會影響您的進程。)您可以使用Dir.chdir()來更改進程的目錄。在使用它們之前,您也不需要將您的命令放入變量中。我會做這樣的事情:

system("mkdir /usr/java") 
system("cp /home/user/Downloads/file.txt /usr/java/") 
Dir.chdir("/usr/java/") 

注意,有沒有必要sleep()如果你只是等待複製完成; system()已經等命令完成。無論如何,如果沒有,sleep(2)會有點脆弱。

更新:隨着您的更新信息,它真的看起來像你最好使用shell腳本,至少在你的腳本的這部分。你可能通過ENV在Ruby中設置環境變量,但它會很尷尬。像這樣的東西更有意義:

#!/bin/bash 

mkdir /usr/java 
cp /home/user/Downloads/file.txt /usr/java/ 
cd /usr/java/ 
export JAVA_HOME=/usr/java/jdk1.7.0_05 
export PATH=$JAVA_HOME/bin:$PATH 

如果你需要在Ruby中調用它,只需使用system()運行該腳本。一定要設置可執行位,或者使用shell調用它(例如system("bash script_name"))。

+0

非常感謝,我嘗試過的系統(「bash export JAVA_HOME =/usr/java/jdk1.7.0_05」),但是它給出以下錯誤bash:export:沒有這樣的文件或目錄,爲什麼它是..謝謝。 – itsme 2012-08-16 12:34:55

+0

@itsme是的,該命令告訴Ruby運行'bash',它被告知運行一個名爲'export'的命令,whi ch不存在。不過,我不確定你想要完成什麼。如果你按照我的建議將你的shell命令放在shell腳本中,你就不需要這樣的東西。 – 2012-08-16 13:03:13

+0

嘿,你可以直接給我一些紅寶石和廚師的在線資源(系統集成框架),因爲我剛剛進入了我作爲軟件人員職業生涯的專業階段。 – itsme 2012-08-16 13:12:23