如何使特定的命令行程序可用于在Automator中运行的Ruby代码

5cg8jx4n  于 2023-08-04  发布在  Ruby
关注(0)|答案(1)|浏览(85)

ruby中有many ways来进行系统调用。
我现在使用open 3的方法是这样的:

def run_system_command { |system_command|
   
  stdout_str = ""
  stderr_str = ""
  status = ""
 
  Open3.popen3(system_command) do |stdin, stdout, stderr, wait_thr|
     stdin.close                
     stdout_str = stdout.read   # read stdout to string. note that this will block until the command is done!
     stderr_str = stderr.read   # read stderr to string
     status = wait_thr.value    # will block until the command finishes; returns status that responds to .success? etc
  end
 
  return stdout_str, stderr_str, status
}

字符串
它在运行基本的系统命令时工作正常,如tarlscd等。
但是当我尝试从Automator 'Run Shell Script'运行ios-deploy这样的程序时,我没有得到任何结果:
x1c 0d1x的数据
(假设在块中定义了run_system_command方法。Automator文本字段不会展开,所以我无法向您展示整个内容)
我没有从这样的调用中得到任何输出,这让我认为在Ruby中进行系统调用不会看到ios-deploy程序。
请注意,我已经确保我可以通过在一个简单的“Hello World”“Run Shell Script”操作中使用“Set Value of Variable”和“Display Notification”操作来获得Ruby的输出。
我如何告诉ruby如何使用/在哪里找到程序?
某种路径调整?我不确定在用这种方式调用Ruby时在哪里进行这样的更改。
更新:我可以通过使用程序的完整路径来使命令工作:

/usr/local/bin/ios-deploy


有没有一种方法可以告诉Ruby/Automator在哪里找到程序,而不必每次都显式地使用路径前缀?

cx6n0qe3

cx6n0qe31#

有没有一种方法可以告诉Ruby/Automator在哪里找到程序,而不必每次都显式地使用路径前缀?
. Automator运行Ruby(以及其他shell脚本)时使用的环境PATH设置为/usr/bin:/bin:/usr/sbin:/sbin,即它将只搜索/usr/bin/bin/usr/sbin/sbin中可执行文件。
我没有看到任何在Automator中配置环境的方法,但至少你可以通过ENV#[]=在Ruby中修改环境,例如:

ENV['PATH'] = "/usr/local/bin:#{ENV['PATH']}"

字符串
这样,当运行shell命令时,/usr/local/bin中的可执行文件将变得可用:
x1c 0d1x的数据
Open3.popen3也接受环境变量作为参数:(参见Process.spawn的文档)

require 'open3'

env = { 'PATH' => "/usr/local/bin:#{ENV['PATH']}" }
command = 'brew --version'

Open3.popen3(env, command) do |stdin, stdout, stderr, wait_thr|
  # ...
end

相关问题