【问题标题】:Unable to send terminal commands using Ruby无法使用 Ruby 发送终端命令
【发布时间】:2012-11-01 13:41:13
【问题描述】:

我需要知道如何通过 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

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

任何建议将不胜感激。

【问题讨论】:

    标签: ruby environment-variables watir


    【解决方案1】:

    认为每个system() 命令都会得到不同的shell。

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

    【讨论】:

    • 感谢您的回复。我对 ruby​​ 很陌生,所以我不知道该怎么做。
    • 这不是 Ruby 的问题,它正在学习如何将命令放入 shell 脚本并从 Ruby 调用它。后者非常简单:`ls -al` 就是一个例子。有关更多示例,请使用 ri 获取 Kernel#systemIO.popenOpen3.popen2Open3.popen3 的文档。
    【解决方案2】:

    像这样修复它:

    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 设置环境变量仅为该子进程设置它,对系统的下一次调用是具有新环境的新子进程。

    上面的方案是在父进程中设置环境变量,所以所有子进程都会设置。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-09-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-18
      相关资源
      最近更新 更多