【问题标题】:How do I specify the shell to use for a ruby system call?如何指定用于 ruby​​ 系统调用的 shell?
【发布时间】:2009-08-06 15:04:57
【问题描述】:

我正在尝试通过 system(或使用反引号)从 ruby​​ 运行命令,但遇到了问题。当我尝试调用命令时,shell 无法找到它,即使我知道如果我直接调用它就可以工作。例如:

`zip`
>> sh: zip: command not found

问题似乎是ruby使用sh shell,其中$PATH设置不正确,而不是bash,我不知道为什么。运行我的应用程序的用户默认设置为使用bash

有没有办法告诉 ruby​​ 使用bash 而不是sh

【问题讨论】:

    标签: ruby bash shell


    【解决方案1】:

    据我所知,唯一的方法是显式调用 shell,例如

    `bash -c zip`
    

    `#{ ENV['SHELL'] } -c zip`
    

    或与系统:system("bash", "-c", command)

    然而,ruby(以及所有由 ruby​​ 产生的进程)应该继承父进程的环境,因此即使使用另一个 shell 也可以正确设置 $PATH。您是否可能从 cron 作业或初始化脚本等运行 ruby​​,但 PATH 设置不正确?

    【讨论】:

    • 调用来自网络,而不是来自 cron 或作为脚本。 apache 会不会改变我的路径?
    • 很可能是这样。 (好吧,大概 apache 不会更改 PATH,但 PATH 尚未设置为其通常的值,因为在调用 apache 之前没有获取您的 rc 文件)。
    • 如果您需要将zip 替换为多字命令,并且您不能使用多个参数(例如IO.popen),请使用转义引号,例如system("bash -c \"cat food\"")
    【解决方案2】:

    我猜 Ruby 使用 system() C 函数,它使用 /bin/sh。在大多数系统中,/bin/sh 只是指向其他 shell 的符号链接,因此您可以更改为您想要的任何内容

    【讨论】:

    • 嗯。 /bin/sh 确实是一个符号链接...到 /bin/bash!因此,出于某种原因,它将PATH 设置为与通常不同的东西?
    【解决方案3】:

    为什么不只指定 zip 可执行文件的完整路径。

    【讨论】:

    • 是的,我可以。我没有的原因是它是在多个开发环境中开发的,并且路径不一定都相同。
    • 像 whereis 这样的命令应该始终在路径中。或所有发行版 /usr/bin/whereis 中的常见位置,这可能是查找可能分散的垃圾箱的好解决方案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-06-06
    • 2015-01-02
    • 2012-10-04
    • 2011-04-27
    • 1970-01-01
    • 2020-07-08
    • 2012-04-07
    相关资源
    最近更新 更多