代码之家  ›  专栏  ›  技术社区  ›  dukebd711

鲁比:method缺少反勾错别字?

  •  1
  • dukebd711  · 技术社区  · 11 年前

    我正在构建一种方法,当我的ruby脚本失败时,通过mutt向我发送电子邮件。它看起来像这样:

    begin
        UnknownFunction()
    rescue
        subject = 'Error'
        to_array = ['email@email.com','email2@email.com']
        body = "An error occurred:\n#{$!}"
        %x[echo "#{body}" | mutt -s "#{subject}" #{to_array.join(",")}]
    end
    

    命令引发以下错误:

    sh: -c: line 1: unexpected EOF while looking for matching ``'
    sh: -c: line 2: syntax error: unexpected end of file
    

    我终于仔细看了一眼,看到了那美元!在未定义的方法名称之前包含一个倒勾,后跟一个单引号:

    undefined method `UnknownFunction' for main:Object
    

    我深入研究了代码,并验证了method_missing方法之前有一个倒勾,之后有一个单引号。倒勾应该是单引号还是反过来?如果没有,背后的原因是什么?

    raise NoMethodError, "undefined method `#{mid}' for #{self}", caller(1)
    
    3 回复  |  直到 11 年前
        1
  •  3
  •   Community Mohan Dere    8 年前

    在纯文本/Unicode之前的环境中,它是开放式单引号()的替代品。参见: Why do plain-text technical articles often enclose terms within backticks and single quotes?

        2
  •  2
  •   Chuck    11 年前

    NoMethodError的描述并不意味着是代码,因此使用倒勾纯粹是出于美学原因。如果要将任意字符串传递给shell,请使用 Shellwords.shellescape .

        3
  •  1
  •   the Tin Man    11 年前

    backticks对于简单的命令来说很好,但一旦开始向子进程抛出数据,我认为使用比通过管道发送文本更复杂的方法更好 echo .我会用 IO.popen :

    IO.popen(
      "mutt -s '%s' %s" % [ subject, to_array.join(',') ],
      'w'
    ) do |mutt|
      mutt.puts body
    end
    

    这是未经测试的,但我会从这开始。它的可读性更强,因为它摆脱了插值变量的倒勾丛林。它还避免了子shell试图通过解释变量或在发送给mutt的文本中查找嵌入的反引号来帮助的潜在问题。