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)

在上面的代码中,mkdirandcp命令可以正常工作,但问题出在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)
4

2 回答 2

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 脚本,至少对于脚本的这一部分。您可以通过 设置 Ruby 中的环境变量ENV,但这会很尴尬。这样的事情更有意义:

#!/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()运行脚本即可。请务必设置可执行位,或使用您的外壳程序调用它(例如system("bash script_name"))。

于 2012-08-16T06:22:02.500 回答
1

您可以尝试使用 Dir.chdir '/usr/java/'

要查看 irb 会话中的当前文件,您可以执行 `ls`

于 2012-08-16T05:45:51.497 回答