(cat >&3) 'http://example.or-6ren">
gpt4 book ai didi

ruby - Bash语法错误在Ruby中执行命令,但它在shell中有效

转载 作者:太空宇宙 更新时间:2023-11-04 12:25:02 25 4
gpt4 key购买 nike

这是命令(我使用的是它的一个细微变化,但这会产生相同的错误)

HTTP_STATUS=$(curl -w "%{http_code}" -o >(cat >&3) 'http://example.org')

至于这个是做什么的,大部分是从https://superuser.com/a/862395/334171复制过来的...重点是将 HTTP 请求的输出打印到终端,但将状态代码存储在 bash 变量中。如果我在终端中运行它,这很好用。

但是,当我从 Ruby 运行它时,我得到 sh: 1: Syntax error: "("unexpected:

cmd = <<-SH
HTTP_STATUS=$(curl -w "%{http_code}" -o >(cat >&3) 'http://example.org')
SH
system cmd
`#{cmd}`

这两个都因上述错误而失败。

我想作为一种解决方法,我可以放入一个 shell 脚本并从 Ruby 调用它。但我很好奇为什么它不能以内联方式工作。

最佳答案

bash 在使用名称 sh 运行时表现不同,因此 /bin/bash/bin/sh 即使 /bin/sh 真的是 /bin/bash 也会表现不同。特别是,当 bash 作为 sh 运行时,它尽可能地符合 POSIX 规范,因此 bash 特定的扩展(例如您的>(cat >&3)) 将不起作用。此外,Ruby 中的反引号和相关方法始终使用系统 shell(即 /bin/sh)。总结:如果您在 Ruby 中使用 shell,那么您几乎总是最终会使用严格的 POSIX shell。

您可以显式调用 /bin/bash 并使用 -c 向其提供命令。不过,这可能会涉及逃跑的噩梦。

更好的方法是使用 Open3 绕过 shell(所有这些)来自 Ruby 标准库。 Open3 中有多种方法用于捕获和管道化标准输出和标准错误,您不必担心 shell 引用任何内容,因为不涉及 shell。

顺便说一句,如果你真的想通过反引号或 system 设置环境变量,它不会起作用,因为环境变量是子进程的本地变量,所以父进程(你的 Ruby 脚本或任何调用你的 Ruby 脚本的东西)都不会看到它们。

关于ruby - Bash语法错误在Ruby中执行命令,但它在shell中有效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44980434/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com