ruby-on-rails - 如何使 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]
解决方案
假设您想要 shell builtin pushd
,您需要在系统命令中显式调用 bash ,因为 ruby 不引用您的 $SHELL 变量。就像是:
require 'open3'
require 'shellwords'
Open3.popen3("bash -c #{Shellwords.escape(cmd)}")
应该做的伎俩。
推荐阅读
- python - 熊猫为字典值中列表的每个元素创建一列?
- java - Junit 使用扫描仪输入测试方法
- list - 从 Map 值生成的 Groovy groupby 列表
- python - Why is `to_numpy()` recognized as an attribute rather than a method of dataframe?
- machine-learning - 时间序列中的分类模式
- regex - 如何维护对多个已编译正则表达式的引用
- graphql - 如何在构建时有条件地更改 gatsby 中的 graphql 查询中的对象类型名称?
- r - 如何使用 for 循环获取多个样本?
- c - Zlib在C中解压缩具有未知压缩长度的字节
- java - 打印一个从 0 到输入的能被 3 整除或以 3 结尾的数字