假设我在变量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")
…但是任何特殊字符搞砸了,我无法删除特殊字符.我该怎么办?
解决方法
哦,快乐的注射.您正在寻找
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"