What is the "eval" command in bash?
eval
is part of POSIX. Its an interface which can be a shell built-in.
Its described in the "POSIX Programmer's Manual": http://www.unix.com/man-page/posix/1posix/eval/
eval - construct command by concatenating arguments
It will take an argument and construct a command of it, which will be executed by the shell. This is the example of the manpage:
1) foo=10 x=foo
2) y='$'$x
3) echo $y
4) $foo
5) eval y='$'$x
6) echo $y
7) 10
- In the first line you define
$foo
with the value'10'
and$x
with the value'foo'
. - Now define
$y
, which consists of the string'$foo'
. The dollar sign must be escaped with'$'
. - To check the result,
echo $y
. - The result will be the string
'$foo'
- Now we repeat the assignment with
eval
. It will first evaluate$x
to the string'foo'
. Now we have the statementy=$foo
which will get evaluated toy=10
. - The result of
echo $y
is now the value'10'
.
This is a common function in many languages, e.g. Perl and JavaScript. Have a look at perldoc eval for more examples: http://perldoc.perl.org/functions/eval.html
Yes, eval
is a bash internal command so it is described in bash
man page.
eval [arg ...]
The args are read and concatenated together into a single com-
mand. This command is then read and executed by the shell, and
its exit status is returned as the value of eval. If there are
no args, or only null arguments, eval returns 0.
Usually it is used in combination with a Command Substitution. Without an explicit eval
, the shell tries to execute the result of a command substitution, not to evaluate it.
Say that you want to code an equivalent of VAR=value; echo $VAR
. Note the difference in how the shell handles the writings of echo VAR=value
:
andcoz@...:~> $( echo VAR=value ) bash: VAR=value: command not found andcoz@...:~> echo $VAR <empty line>
The shell tries to execute
echo
andVAR=value
as two separate commands. It throws an error about the second string. The assignment remains ineffective.
The shell merges (concatenates) the two stringsandcoz@...:~> eval $( echo VAR=value ) andcoz@...:~> echo $VAR value
echo
andVAR=value
, parses this single unit according to appropriate rules and executes it.
Last but not least, eval
can be a very dangerous command. Any input to an eval
command must be carefully checked to avoid security problems.
The eval statement tells the shell to take eval’s arguments as command and run them through the command-line. It is useful in a situation like below:
In your script if you are defining a command into a variable and later on you want to use that command then you should use eval:
/home/user1 > a="ls | more"
/home/user1 > $a
bash: command not found: ls | more
/home/user1 > # Above command didn't work as ls tried to list file with name pipe (|) and more. But these files are not there
/home/user1 > eval $a
file.txt
mailids
remote_cmd.sh
sample.txt
tmp
/home/user1 >