gpt4 book ai didi

Ruby,exec、system 和 %x() 或反引号之间的区别

转载 作者:数据小太阳 更新时间:2023-10-29 06:16:15 24 4
gpt4 key购买 nike

以下 Ruby 方法有什么区别?

execsystem%x()Backticks

我知道它们用于通过 Ruby 以编程方式执行终端命令,但我想知道为什么有三种不同的方法来执行此操作。

最佳答案

系统

system方法调用系统程序。您必须将命令作为字符串参数提供给此方法。例如:

>> system("date")
Wed Sep 4 22:03:44 CEST 2013
=> true

调用的程序将使用 Ruby 程序的当前 STDINSTDOUTSTDERR 对象。事实上,实际的返回值是 truefalsenil。在示例中,日期是通过 STDIN 的 IO 对象打印的。如果进程以零状态退出,该方法将返回 true,如果进程以非零状态退出,则返回 false,如果执行失败。

从 Ruby 2.6 开始,传递 exception: true 将引发异常,而不是返回 falsenil:

>> system('invalid')
=> nil

>> system('invalid', exception: true)
Traceback (most recent call last):
...
Errno::ENOENT (No such file or directory - invalid)

另一个副作用是全局变量 $? 被设置为 Process::Status目的。该对象将包含有关调用本身的信息,包括被调用进程的进程标识符 (PID) 和退出状态。

>> system("date")
Wed Sep 4 22:11:02 CEST 2013
=> true
>> $?
=> #<Process::Status: pid 15470 exit 0>

反引号

Backticks (``) 调用系统程序并返回其输出。与第一种方法相反,该命令不是通过字符串提供的,而是通过将其放在反引号对中提供的。

>> `date`
=> Wed Sep 4 22:22:51 CEST 2013

全局变量 $? 也是通过反引号设置的。通过反引号,您还可以使用字符串插值。

%x()

使用 %x 是反引号样式的替代方法。它也会返回输出。就像它的亲戚 %w%q (以及其他)一样,只要括号式定界符匹配,任何定界符就足够了。这意味着 %x(date)%x{date}%x-date- 都是同义词。像反引号一样,%x 可以使用字符串插值。

执行

通过使用 Kernel#exec当前进程(您的 Ruby 脚本)被替换为通过 exec 调用的进程。该方法可以将字符串作为参数。在这种情况下,字符串将进行 shell 扩展。当使用多个参数时,第一个参数用于执行程序,以下参数作为参数提供给要调用的程序。

Open3.popen3

有时所需的信息会写入标准输入或标准错误,您也需要控制这些信息。这里Open3.popen3派上用场:

require 'open3'

Open3.popen3("curl http://example.com") do |stdin, stdout, stderr, thread|
pid = thread.pid
puts stdout.read.chomp
end

关于Ruby,exec、system 和 %x() 或反引号之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6338908/

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