2012-08-16 129 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