5

変数にたくさんのテキストがあるとしましょうsome_var、それはほとんど何でもかまいません。

some_var = "Hello, I'm a \"fancy\" variable | with a pipe, double- and single-quotes (terminated and unterminated), and more."

また、CLI Ruby アプリケーションで、ユーザーがそのテキストを任意の Unix コマンドにパイプできるようにしたいとします。のようなものを入力できるようsome_var | espeak -a 200 -v en-usにしました。パイプの右側のコマンドは、システムにインストールされている UNIX CLI ツールです。

また、変数の選択とパイプを入力から分離する処理を既に行っているとしましょう。そのため、パイプの後のコマンドが 100% 確実にわかります。(この場合、変数の内容を にパイプしますespeak -a 200 -v en-us。)

どうすればいいですか?%x[]バックティック法やリテラルは使えないと思います。私は次のことをやってみました...

system("echo '#{some_var}' | espeak -a 200 -v en-us")

...しかし、特殊文字はすべてを台無しにし、特殊文字を削除することはできません。私は何をすべきか?

4

5 に答える 5

7

popenあなたも見ることができる以外にShellwords.escape

puts Shellwords.escape("I'm quoting many different \"''' quotes")
=> I\'m\ quoting\ many\ different\ \"\'\'\'\ quotes

これにより、特殊文字の引用が処理されます(bash互換):

system("echo '#{Shellwords.escape(some_var)}' | ....")

http://www.ruby-doc.org/stdlib-1.9.3/libdoc/shellwords/rdoc/Shellwords.html

于 2012-05-24T07:21:19.883 に答える
5

ああ、ハッピーインジェクション。を探してい IO.popenます。

IO.popen('grep ba', 'r+') {|f| # don't forget 'r+'
  f.puts("foo\nbar\nbaz\n") # you can also use #write
  f.close_write
  f.read # get the data from the pipe
}
# => "bar\nbaz\n"
于 2012-05-24T07:10:47.647 に答える
0

あはは!見つけた。このページによると、Kernel#open実際にプロセスを開いて、ファイルだけでなくデータをパイプすることができます!

some_var = "Hello, I'm a \"fancy\" variable | with a pipe, double- and single-quotes (terminated and unterminated), and more."
# some_command = "espeak -a 200 -v en-us" # also works
some_command = "cat"

cmd = "|" + some_command
open(cmd, 'w+') do | subprocess |
  subprocess.write(some_var)
  subprocess.close_write
  subprocess.read.split("\n").each do |output|
    puts "[RUBY] Output: #{output}"
  end
end
于 2012-05-24T07:45:41.230 に答える
-2

システムコールに変数を渡す例:

irb(main):019:0> b = "test string string string"
=> "test string string string"
irb(main):020:0> system("echo " + "#{b}" + "|" + "awk '{print $2}'")
string
=> true

@Kerrick終了していない引用符や括弧などがある場合でも、多くの構文エラーが発生します

多分:

some_var = "'Hello, Im a \"fancy\" variable | with a pipe, double- and single-quotes (terminated and unterminated), and more.'"
    => "'Hello, Im a \"fancy\" variable | with a pipe, double- and single-quotes (terminated and unterminated), and more.'"

irb(main):020:0> system("echo " + "#{some_var}" + "|" + "awk '{print $2}'")Im
        => true
于 2012-05-24T07:21:15.297 に答える