首页 > 解决方案 > 如何使 Ruby 与 bash 兼容

问题描述

我有一个 ruby​​ 脚本,用于open3从脚本内部运行 shell 命令,我使用的是 Ubuntu 18.04 和 bash。

当我运行该脚本时,它会产生错误,例如0: sh: 2: pushd: not found. 我进行了搜索,发现一件事是https://stackoverflow.com/a/17044484/5553963,它建议我们使用ENV["SHELL"] = "/bin/bash",但是当我检查我的环境变量时,我已经有了:

$ printenv "SHELL"
/bin/bash

我怎样才能使这个脚本在我的机器上工作?

该脚本的第一部分:

#!/usr/bin/env ruby

require 'open3'

def run(i, cmd)
    res = ""
    Open3.popen3(cmd) do |stdin, stdout, stderr, thread|

还有我的红宝石版本:ruby 2.5.1p57 (2018-03-29 revision 63029) [x86_64-linux-gnu]

标签: ruby-on-railsrubylinuxbashshell

解决方案


假设您想要 shell builtin pushd,您需要在系统命令中显式调用 bash ,因为 ruby​​ 不引用您的 $SHELL 变量。就像是:

require 'open3'
require 'shellwords'
Open3.popen3("bash -c #{Shellwords.escape(cmd)}")

应该做的伎俩。


推荐阅读