无法使用Ruby发送终端命令

时间:2012-11-01 13:41:14

标签: ruby environment-variables watir

我需要知道如何通过Ruby发送终端命令来执行另一个应用程序。我想在Watir脚本中的某个点调用SIKULI脚本来处理Watir无法完成的一些步骤。

我不知道该怎么做。我在Stack Overflow上阅读了一些文章,但无法让它发挥作用。

这些是手动执行它的步骤:

jfleck-mbp:~ joe.fleck$ SIKULI_HOME=/Applications/Sikuli-IDE.app/Contents/Resources/Java
jfleck-mbp:~ joe.fleck$ java -jar $SIKULI_HOME/sikuli-script.jar '/Users/joe.fleck/Desktop/Save_File_Button.sikuli'

这些是我试图执行的Ruby文件:

require 'rubygems'
system('SIKULI_HOME=/Applications/Sikuli-IDE.app/Contents/Resources/Java')
system ("java -jar $SIKULI_HOME/sikuli-script.jar '/Users/joe.fleck/Desktop/Save_File_Button.sikuli'")

我得到的输出是:

Unable to access jarfile /sikuli-script.jar

告诉我脚本中的第一行没有执行,允许访问。

任何建议都将不胜感激。

2 个答案:

答案 0 :(得分:3)

认为你在每个system()命令中得到一个不同的shell。

一种简单的验证方法,以及一种更易于维护的方法,恕我直言,将所有命令放在一个(bash / zsh /无论)脚本中,并使用system()运行

答案 1 :(得分:1)

修复如下:

ENV['SIKULI_HOME'] = '/Applications/Sikuli-IDE.app/Contents/Resources/Java'
system ("java -jar $SIKULI_HOME/sikuli-script.jar '/Users/joe.fleck/Desktop/Save_File_Button.sikuli'")

问题在于,当您致电system时,您正在调用子进程。子进程从父进程继承环境(在本例中是Ruby脚本)。使用system设置环境变量仅为该子进程设置它,下一次对系统的调用是具有全新环境的新子进程。

上面显示的解决方案在父进程中设置环境变量,因此将为所有子进程设置它。