【问题标题】:Ruby script equivalent to the linux `set` command's `-x` flag?Ruby 脚本相当于 linux `set` 命令的 `-x` 标志?
【发布时间】:2022-01-22 23:27:29
【问题描述】:

当 bash 脚本运行时,set -x 命令可用于print all commands and output as they're being executed

我正在编写一个 Ruby 脚本。有没有办法在执行命令时也打印命令和输出?

【问题讨论】:

  • 我认为它实际上不可能存在。一切都被封装了,当你调用一个函数时,实际上调用了很多子函数,输出任何函数调用都是无用的。此外,从未听说过 ruby​​ 的此功能。

标签: ruby shell script


【解决方案1】:

TL;DR

在解释时,Ruby 解析和运行代码的方式与 Bash 或 Tcl 等语言非常不同,因此没有内置的方法可以完全按照您的意愿行事。您必须使用调试器或 REPL 来获得近似于您正在尝试做的事情,但这与在 Bash 中使用 -x-v 之类的标志实际上不同。不过,外部或基于 IDE 的调试器可能最接近。

几个选项

没有内置的方法可以做到这一点,因为 Ruby 并不是像 Bash 或 Tcl 那样真正的逐行解释语言。虽然 Ruby 通常被认为是一种解释性语言,但它实际上使用标记器和解析器来生成在 YARV 或 GraalVM 等虚拟机上运行的代码。不过,您确实有几个选择:

  1. 在代码中使用-d 标志或将$DEBUG 设置为真实值,然后根据是否启用调试标志进行某种程度的自省。例如:

    # 1 is printed because $DEBUG is truthy
    $ ruby -e 'BEGIN { $DEBUG = true }; puts 1 if $DEBUG'
    1
    
    # nothing is printed because $DEBUG is falsey
    $ ruby -e 'puts 1 if $DEBUG'
    

    请注意,Ruby 3.0.3 和 3.1.0 似乎存在-d 标志的问题,因此第一个示例使用 BEGIN 语句在程序中设置标志的值。

  2. 使用debug gem(现在是 Ruby 3 的标准)。您可以使用 rdbg 单步执行代码并随意使用 list 命令,或者(如果您很聪明的话)使用 ~/.rdbgrc 文件在特定行上编写一系列列表命令。

  3. 使用外部调试器,带或不带 rdbg。请注意,新的调试器支持基于 IDE 的调试(例如,使用 RubyMine 或VS Code)和remote debugging,但设置 IDE 或远程调试可能是一个超出合理 SO 答案范围的主题。

  4. 将 irb 或 pry 与您选择的调试器一起使用,这通常为您提供多种检查源代码、帧、表达式、变量等的方法,尽管您需要从磁盘文件而不是从磁盘文件中运行一个 REPL 来访问您可能正在寻找的一些功能。

在大多数情况下,如果您不使用 IDE 或调试器,则通常需要依赖 REPL 中的返回值或代码中的 Kernel#pp 语句来检查返回值。但是,如果没有支持根据请求列出方法或代码行的调试器或 REPL,您将需要使用外部工具来解决您试图通过这种方法以另一种方式解决的任何问题。

其他选项

如果您使用 pry,pry-rescue gempry-stack_explorer 将允许您自动触发 REPL 会话,如果您遇到异常,则允许您在堆栈上下遍历而无需 start 您在 REPL 中的会话或显式调用 binding.pry。在受支持的 Ruby 版本上,这可能非常有用,特别是因为 Pry 支持 show-source -l 命令,该命令将执行类似于您想要的操作(至少以交互方式),尽管行号可能不是您所期望的,如果代码直接在 REPL 中输入,而不是从磁盘上的 Ruby 程序加载。

【讨论】:

    猜你喜欢
    • 2010-09-20
    • 1970-01-01
    • 1970-01-01
    • 2010-10-10
    • 1970-01-01
    • 1970-01-01
    • 2011-06-02
    • 1970-01-01
    • 2021-01-10
    相关资源
    最近更新 更多