Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to run script commands from variables?

I tried to run commands using pipes.

Basic:

single="ls -l"
$single

which works as expected

Pipes:

multi="ls -l | grep e"
$multi
ls: |: No such file or directory
ls: grep: No such file or directory
ls: e: No such file or directory

...no surprise

bash < $multi

$multi: ambiguous redirect

next try

bash $multi
/bin/ls: /bin/ls: cannot execute binary file

Only

echo $multi > tmp.sh
bash tmp.sh

worked.

Is there a way to execute more complex commands without creating a script for execution?

like image 662
stacker Avatar asked Aug 12 '10 16:08

stacker


1 Answers

You're demonstrating the difference between the shell and the kernel.

"ls -l" is executable by the system execve() call. You can man execve for details, but that's probably too much detail for you.

"ls -l | grep e" needs shell interpretation to set up the pipe. Without using a shell, the '|' character is just passed into execve() as an argument to ls. This is why you see the "No such file or directory" errors.

Solution:

cmd="ls -l | grep e"
bash -c "$cmd"
like image 137
bukzor Avatar answered Oct 08 '22 01:10

bukzor