Any substitution you haven't escaped with \ happens before you run eval, just as if you'd passed that string into anything else. Only after it does that, will it evaluate the string as raw shell syntax.
Out of curiosity, why is eval considered evil . The hits I find with an internet search are pretty much all java & perl, so what is a problem to ksh?
I try to avoid it, but there are occasions where I can't find another sensible way. I understand the cost of another process, especially if it's used in a loop, but is it dangerous.
I feel such a fool. Fortunately, I only use it to get an indirect variable or scheduled tasks reading in assignments from a parameter file that I control, which is a pretty rare need in itself.
Things such as:-
or
.... where $parmfile contains statements such as:-
I must admit that the parameter file is very closely guarded, but I agree it is susceptible to what you suggest.
I'm a little worried now...... Time to think a bit harder for older ksh. Any suggestions of a better way are very welcome.
I feel such a fool. Fortunately, I only use it to get an indirect variable
In BASH, you can get an indirect variable via
This is a bash-only feature sadly, I used to think ksh93 had it too..
Quote:
...or scheduled tasks reading in assignments from a parameter file that I control, which is a pretty rare need in itself.
You can set arbitrary variable names with the read builtin, which will work in any shell. This trick works because read takes a variable name, not the variable itself.
Out of curiosity, why is eval considered evil . The hits I find with an internet search are pretty much all java & perl, so what is a problem to ksh?
I try to avoid it, but there are occasions where I can't find another sensible way. I understand the cost of another process, especially if it's used in a loop, but is it dangerous.
Thanks, in advance,
Robin
Hi Robin,
The eval command isn't evil, it is just dangerous to use it to evaluate any user supplied text. In a script, it can be used safely to evaluate commands when the command is entirely under the control of the script writer. For example to get the value of the last two command line arguments passed to a shell script, save the following in a file named last2:
and make it executable:
Then the command:
will print:
if there are 7 files in the current directory and the last one (sorted alphabetically) is named zebra.
As Corona688 has already shown, if the script were then to use eval on the user supplied input stored in $last, the results could ruin the day for the user with the login name loginID!
Quote:
Originally Posted by Corona688
In BASH, you can get an indirect variable via
This is a bash-only feature sadly, I used to think ksh93 had it too..
...
Hi Corona688,
There are name reference variables in ksh93, but the syntax is different. In ksh you have to explictly state that a variable is to be treated as a reference variable using either the nameref or the typeset -n command. They can be used as shown here:
which produces the following combined stdout and stderr output:
Last edited by Don Cragun; 04-24-2013 at 06:01 PM..
Reason: Fix typos.
These 3 Users Gave Thanks to Don Cragun For This Post:
Hello All,
Since my variables are nested I use eval to populate the data.
I have an ambiguity here when eval is used along with &
say I have the below variable
url="www.unix.com" , this come from function call as argument.
I want to take this into another variable say... (6 Replies)
Hi all,
some small script with eval turned me to crazy.
my OS is linux
Linux s10-1310 2.6.16.53-0.8.PTF.434477.3.TDC.0-smp #1 SMP Fri Aug 31 06:07:27 PDT 2007 x86_64 x86_64 x86_64 GNU/Linux
below script works well
#!/bin/bash
eval ssh remotehost date
eval ssh remotehost ls
below... (1 Reply)
hi all,
Am trying to add some code to a ksh script and i dont understand how an eval function is used :
_var=$1
_conceal=$2
eval _val=\$${_var}
can someone shed some light on what the eval function in the above context means/does ??
thanks. (4 Replies)
I am trying to expand the variable $user in my alias command and tried
several variations of eval but can't seem to get it to work.
The end result should be either:
oracle_user='sudo su - oracle ' or oracle_user='sudo su - oracle1 '
user=$(grep '^oracle:' /etc/passwd | cut... (5 Replies)
Hi,
I have snippet like the following
x="1"
prompt1="hi"
if I say
eval echo \$prompt$x then it is giving o/p "hi"
if I say `eval echo \$prompt$x` here it is giving 1 !
if I add one more escape character i.e.
`eval echo \\$prompt$x` then it is giving "hi"
Can you please... (3 Replies)
Hi, I have two files "foo" and "bar"
$ cat foo
a is \$a and b is \$b
$ cat bar
car tree
using the below 'while' loop I expect the output to be: a is car and b is tree
while read a b; do
eval echo $(cat foo) # o/p: a is $a and b is $b
eval "echo $(eval "cat foo")"... (1 Reply)
Hi All,
I'm running some encrypted data through a script I wrote. In order to do this, I'm using eval to resolve some of my variables. At the moment, when I use eval to resolve, it strips out some of my encrypted values, and totally drops some others. For example if I have the value ab1"3 it drops... (1 Reply)