Hi. I haven't written Ruby in a while, and I was wondering if someone
could help with a problem I've never managed to solve. I'm writing a
shell script that takes filenames as its arguments, and calls "du" to
get their size. Because I don't want to have to escape everything
perfectly, I was looking for a function with a syntax that allows
separate arguments, like system("du", "-sh", filename).
system() doesn't allow me to capture the output of the subprocess,
while popen , ``, and %x() don't let me specify a list of discrete
arguments. Is there an elegant solution to this problem? My current
solution is to just escape the arguments and put them into a string,
but this is ugly and buggy.
One possibility might be to let Shellwords handle the
escaping:
irb(main):001:0> require 'shellwords'
irb(main):002:0> args = ["foo", "bar baz", "mary 'had' a", 'little "lamb" and stuff']
irb(main):003:0> puts( args.map {|a| a.shellescape}.join(" ") )
foo bar\ baz mary\ \'had\'\ a little\ \"lamb\"\ and\ stuff
Alternately, if you can use ruby 1.9.x, there appears to be
a very powerful new Kernel.spawn command. (See the `ri`
documentation, several pages...)
Also in 1.9.x, it appears to now be possible to pass an Array for the command arguments to popen:
irb(main):001:0> IO.popen(["ls", "-l", "GL_GameOfLife.zip", "quake3-1.32b-source.zip"], "r") {|io| puts(io.read)}
-rw------- 1 billk billk 3540592 Feb 23 2009 GL_GameOfLife.zip
-rw------- 1 billk billk 5724791 Sep 21 2005 quake3-1.32b-source.zip
Hope this helps,
Bill
···
From: "Dan Q" <quinxex@gmail.com>