If you don't understand why it works, then you've probably set yourself up for a surprise down the line when some kind of input you weren't expecting breaks it. eval is finicky that way. After all you're not feeding data into the shell, you're feeding it entire shell statements, and an unexpected backtick, pipe, semicolon, dollar sign, single quote, double quote, backslash will be interpreted by the shell as part of a statement and cause syntax errors or -- worse -- execute something unintended.
For this reason eval is to be avoided. It's difficult to safely control.
The answer to your question is simple enough. What, precisely, does it print when you run echo instead of eval?
If it prints anything but a completely 100% syntactically-correct shell statement, then eval won't like it. If it's a valid shell statement, eval will run it. Nothing mysterious about it.
It's going to print something like
...which, as it happens, is a valid shell statement for printing those lines. Feed that into eval and it faithfully runs echo to print:
Correct me if I'm wrong, but that's not what you actually wanted, and why we've been shouting at you to ditch the useless echo.
If your file happens to contain a " character anywhere, this will be a huge problem for you, because eval will take it as an end-of-string which will cause a syntax error.
Last edited by Corona688; 05-02-2013 at 02:09 PM..
Yes, exactly. It does the normal substitution step like any other shell command, then starts over.
You have shell variables in your sql file, even though it's not a shell script? Yeah, that's awkward.
One way to substitute would be to put it all into a here-document like this:
This takes the big SQL file, puts cat <<__EOF___ at the front of it, __EOF__ at the end of it, escapes ` and $( and \, prevents people from sneaking out of the here-document with their own __EOF__, and runs it in a shell. It will swallow the entire text nearly raw, substituting variables and nothing else. Results in /tmp/converted, or you can use them directly via a pipe.
This would be far less risky than eval -- less risk of malicious use, and less risk of accidental syntax errors due to embedded ' " | ` ( ) &
Last edited by Corona688; 05-03-2013 at 05:51 PM..
Yes, exactly. It does the normal substitution step like any other shell command, then starts over.
You have shell variables in your sql file, even though it's not a shell script? Yeah, that's awkward.
One way to substitute would be to put it all into a here-document like this:
This takes the big SQL file, puts cat <<__EOF___ at the front of it, __EOF__ at the end of it, escapes ` and $( and \, prevents people from sneaking out of the here-document with their own __EOF__, and runs it in a shell. It will swallow the entire text nearly raw, substituting variables and nothing else. Results in /tmp/converted, or you can use them directly via a pipe.
This would be far less risky than eval -- less risk of malicious use, and less risk of accidental syntax errors due to embedded ' " | ` ( ) &
And, of course, if Ratna would take the echo commands out of the file named by $file_var, she could just use:
and get the same results without having to worry about command substitution and quote removal happening twice. I just don't know why we can't convince her that sourcing a file runs the commands in that file with all of the attendant command substitution, variable expansions, and quote removal that would happen if the commands in that file were located in the calling shell script. Oh, well.
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)