1

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)
4

3 に答える 3

3

これは、プレーン テキスト/ユニコード以前の環境で、単一引用符 (') の代わりに使用されます。参照:プレーンテキストの技術記事で用語がしばしばバッククォートと一重引用符で囲まれているのはなぜですか?

于 2014-07-14T19:09:56.240 に答える
1

バッククォートは単純なコマンドには問題ありませんが、子プロセスでデータをスローし始めたら、テキストをパイプでパイプするよりも洗練されたものを使用する方がよいと思いますecho。私は使用しますIO.popen

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

それはテストされていませんが、私が始めるものです。補間された変数のバックティック ジャングルを取り除くため、より読みやすくなっています。また、サブシェルが変数を解釈したり、mutt に送信されるテキストに埋め込まれたバッククォートを探したりすることで、潜在的な問題を回避します。

于 2014-07-14T19:57:31.340 に答える