views:

2485

answers:

3

Hi all,

Can someone help explain the following:

If I type:

a=`ls -l`

Then the output of the ls command is saved in the variable a

but if I try:

a=`sh ./somefile`

The result is outputed to the shell (stdout) rather than the variable a

What I expected was the result operation of the shell trying to execute a scrip 'somefile' to be stored in the variable.

Please point out what is wrong with my understanding and a possible way to do this.

Thanks.

EDIT:

Just to clarify, the script 'somefile' may or may not exist. If it exsists then I want the output of the script to be stored in 'a'. If not, I want the error message "no such file or dir" stored in 'a'

+3  A: 

I think because the shell probably attaches itself to /dev/tty but I may be wrong. Why wouldn't you just set execute permissions on the script and use:

a=`./somefile`

If you want to capture stderr and stdout to a, just use:

a=`./somefile 2>&1`

To check file is executable first:

if [[ -x ./somefile ]] ; then
    a=$(./somefile 2>&1)
else
    a="Couldn't find the darned thing."
fi

and you'll notice I'm switching to the $() method instead of backticks. I prefer $() since you can nest them (e.g., "a=$(expr 1 + $(expr 2 + 3))").

paxdiablo
its not about the permissions... i want the either error messages or return values to be stored in the variable.
Roman M
What I'm saying is that you don't need to run sh to run the script (and sh will impose its own firewall on the output if you do). Just run the script directly and, for that, you need to 'chmod +x' it.
paxdiablo
Try the following: "chmod u+x somefile; a=`./somefile`" and see what a gets set to then.
paxdiablo
but for my case somefile my not exsists, how to avoid seeing the message "no such file or dir" in the shell but rather have it stored in the variable
Roman M
"if [[ -x ./somefile ]]" is what you're looking for.
paxdiablo
Never mind, see the answer update.
paxdiablo
+1  A: 

You can try the new and improved way of doing command substitution, use $() instead of backticks.

a=$(sh ./somefile)

If it still doesn't work, check if somefile is not actually stderr'ing.

Bogdan
i tried and it didnt work ...
Roman M
probably it can't actually find somefile ;)
Bogdan
+1  A: 

You are correct, the stdout of ./somefile is stored in the variable a. However, I assume somefile outputs to stderr. You can redirect that with 2>&1 directly after ./somefile.

phihag
oh i think i see, so the output in the case 'somefile' doesnt exsists stored in a is nothing but the script by default redirects to stderr which is why i see the error message on the screen as opposed to stored in the variable ?
Roman M
No the stdout of *sh* is stored in a, sh is not passing the stdout of ./somefile back to it's caller.
paxdiablo