Over a million developers have joined DZone.
{{announcement.body}}
{{announcement.title}}

Executing Variables that Contain Shell Operators

DZone's Guide to

Executing Variables that Contain Shell Operators

· Big Data Zone
Free Resource

Need to build an application around your data? Learn more about dataflow programming for rapid development and greater creativity. 

I touched a little on pipes in a previous post. Here’s a quick example of an echo utility which outputs two lines, and a pipe operator which redirects that output to a grep utility which performs a simple filter to only include lines that contain the word “cat”:

shell$ echo -e 'the cat \n sat on the mat' | grep cat
the cat

Cool - since that worked, what do you think will happen if you do the following?

shell$ cmd="echo -e 'the cat \n sat on the mat' | grep cat"
shell$ ${cmd}

In the above example we’re simply assigning the original utility to a shell variable, and then executing it. So why, then, would the output be this?

shell$ ${cmd}
'the cat
 sat on the mat' | grep cat

This is something that has bitten me in the past when I write shell scripts. What’s happening here is that the shell executes the contents of variable cmd as a single command, which means that everything after echo are treated as arguments to the echo utility, including the pipe.

variable-execution

What we actually need to happen is to have the entire contents of cmd evaluated by the shell so that the shell can create the pipeline between the two utilities. This is where the utility eval comes into play - eval tells the shell to concatenate the arguments and have them executed by the shell.

shell$ eval ${cmd}
the cat

The moral of this story is that if you want to execute a variable that includes any shell constructs (such as the pipe in our example) - then make sure you eval. Examples of shell constructs include redirections (i.e. echo "the cat" > file1.txt), shell conditionals, loops and functions.

Check out the Exaptive data application Studio. Technology agnostic. No glue code. Use what you know and rely on the community for what you don't. Try the community version.

Topics:

Published at DZone with permission of Alex Holmes, DZone MVB. See the original article here.

Opinions expressed by DZone contributors are their own.

THE DZONE NEWSLETTER

Dev Resources & Solutions Straight to Your Inbox

Thanks for subscribing!

Awesome! Check your inbox to verify your email so you can start receiving the latest in tech news and resources.

X

{{ parent.title || parent.header.title}}

{{ parent.tldr }}

{{ parent.urlSource.name }}