How to capture output of linux command

You can run linux command:

a = ls /home

and receive output in variable a.

But I would like /home to be variable. So I would invoke command like
this:

a = "ls #{dir}"

This of course doesn’t work, but I hope you get the point.

a = system(“ls #{dir}”) works, but returns only true or false not the
standard output of command.

How can I get standard output of the command and use variable as
parameter?

by
TheR

On Apr 9, 2010, at 04:33 , Damjan R. wrote:

a = "ls #{dir}"

This of course doesn’t work, but I hope you get the point.

remove the double quotes

Damjan R. wrote:

You can run linux command:

a = ls /home

and receive output in variable a.

But I would like /home to be variable. So I would invoke command like
this:

a = "ls #{dir}"

As Ryan said, you need to remove the double quotes. You’re asking the
shell to execute the “ls whatever” command. There’s no such command.

BTW, you actually want double quotes there, but put them around the
parameter:

a = ls "#{dir}"

The purpose of the double quotes here is to protect against the case
where the ‘dir’ variable contain spaces (which are meaningful to the
shell --they separate tokens).

Learn about Dir object. It has methods such as glob which should give
you directory contents. Then you don’t have to care about stdout, nor
quoting.

http://whynotwiki.com/Comparison_of_Escape_class_and_String.shell_escape

Have a look at the first example here

Marc

Excerpts from Albert S.'s message of Fri Apr 09 13:46:34 +0200 2010:

The purpose of the double quotes here is to protect against the case
where the ‘dir’ variable contain spaces (which are meaningful to the
shell --they separate tokens).

If we got hat route you want ls – ${dir} to protect against directories
called “-a” or such … And keep in mind that directories may contain
slashes and such stuff on linux. eg try mkdir a\b
thus using quotes is not enough. It may work for most cases you use
though. Anyway I’d do it right - you never know.

Marc W.

Marc W. wrote:

Learn about Dir object. It has methods such as glob which should give
you directory contents. Then you don’t have to care about stdout, nor
quoting.

http://whynotwiki.com/Comparison_of_Escape_class_and_String.shell_escape

Have a look at the first example here

Marc

Thanks guys.

I used ls just as an example. I am actually calling smartctl command to
find out SMART status of all disks on my computer.

by
TheR

On Apr 9, 8:46 am, Albert S. [email protected] wrote:

The purpose of the double quotes here is to protect against the case
where the ‘dir’ variable contain spaces (which are meaningful to the
shell --they separate tokens).

Posted viahttp://www.ruby-forum.com/.

Keep in mind that ls #{dir} (without the quotes) is also DANGEROUS.
What if you (or someone) set dir = “~; rm -rf ~”? BAD.

So, using quotes is also safer.

Schneider wrote:

On Apr 9, 8:46�am, Albert S. [email protected] wrote:

The purpose of the double quotes here is to protect against the case
where the ‘dir’ variable contain spaces (which are meaningful to the
shell --they separate tokens).

Posted viahttp://www.ruby-forum.com/.

Keep in mind that ls #{dir} (without the quotes) is also DANGEROUS.
What if you (or someone) set dir = “~; rm -rf ~”? BAD.

So, using quotes is also safer.

No, using quotes isn’t safer:

dir = ‘123" ; rm -rf ~ ; echo "’
ls "#{dir}"

Results it doing ls “123” ; rm -rf ~ ; echo “”

This forum is not affiliated to the Ruby language, Ruby on Rails framework, nor any Ruby applications discussed here.

| Privacy Policy | Terms of Service | Remote Ruby Jobs