Eval


 
Thread Tools Search this Thread
Top Forums Shell Programming and Scripting Eval
# 29  
Old 05-02-2013
thank you

Last edited by ratnalein88; 05-06-2013 at 03:47 AM..
# 30  
Old 05-02-2013
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?

Code:
echo echo "\" `cat myfile.file`\""

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
Code:
echo "line1
line2
line3
line4
line5
line6"

...which, as it happens, is a valid shell statement for printing those lines. Feed that into eval and it faithfully runs echo to print:
Code:
line1
line2
line3
line4
line5
line6

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..
# 31  
Old 05-02-2013
thank you

Last edited by ratnalein88; 05-06-2013 at 03:47 AM..
# 32  
Old 05-02-2013
I have already explained repeatedly.

Step 1: Expand things like variables and backticks and backslashes, to turn echo "\" `cat myfile.file`\"" into

Code:
echo "line1
line2
line3
line4
line5"

Step 2: eval it, which runs the given shell statement.
# 33  
Old 05-03-2013
thank you

Last edited by ratnalein88; 05-06-2013 at 03:47 AM..
# 34  
Old 05-03-2013
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:

Code:
cat <<EOF
This will print everything up to an EOF at the beginning of the line
${variables} and `echo backticks` are substituted, but
commands are not.  You can \${escape} them to get the literal characters.
EOF

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.

Code:
echo "cat <<___EOF___" > /tmp/script
sed 's/\\/\\\\/g;s/`/\\`/g;s/^___EOF___/ ___EOF___/' /path/to/sql >> /tmp/script
echo "___EOF___" >> /tmp/script

/bin/sh /tmp/script > /tmp/converted
rm -f /tmp/script

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..
# 35  
Old 05-03-2013
Quote:
Originally Posted by Corona688
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:

Code:
cat <<EOF
This will print everything up to an EOF at the beginning of the line
${variables} and `echo backticks` are substituted, but
commands are not.  You can \${escape} them to get the literal characters.
EOF

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.

Code:
echo "cat <<___EOF___" > /tmp/script
sed 's/\\/\\\\/g;s/`/\\`/g;s/^___EOF___/ ___EOF___/' /path/to/sql >> /tmp/script
echo "___EOF___" >> /tmp/script

/bin/sh /tmp/script > /tmp/converted
rm -f /tmp/script

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:
Code:
. "$file_var"

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.
Login or Register to Ask a Question

Previous Thread | Next Thread

10 More Discussions You Might Find Interesting

1. Shell Programming and Scripting

Error in eval eval command to print html tags

anyone has any info on why this is complaining??? vivek@vivek-c5e55ef2e ~/TAC $ zoneCounter=1 vivek@vivek-c5e55ef2e ~/TAC $ optUsage1=23% vivek@vivek-c5e55ef2e ~/TAC $ eval eval echo "<th>Zone $zoneCounter </th><th align=\"left\"> \$optUsage$zoneCounter </th>" -bash: syntax error... (13 Replies)
Discussion started by: vivek d r
13 Replies

2. Shell Programming and Scripting

Error in eval eval command to print html tags

anyone has any info on why this is complaining??? vivek@vivek-c5e55ef2e ~/TAC $ zoneCounter=1 vivek@vivek-c5e55ef2e ~/TAC $ optUsage1=23% vivek@vivek-c5e55ef2e ~/TAC $ eval eval echo "<th>Zone $zoneCounter </th><th align=\"left\"> \$optUsage$zoneCounter </th>" -bash: syntax error... (1 Reply)
Discussion started by: vivek d r
1 Replies

3. Shell Programming and Scripting

Help on eval please

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)
Discussion started by: sathyaonnuix
6 Replies

4. Shell Programming and Scripting

Strange result of eval, how does eval really work with ssh?

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)
Discussion started by: summer_cherry
1 Replies

5. Shell Programming and Scripting

eval

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)
Discussion started by: cesarNZ
4 Replies

6. Shell Programming and Scripting

eval help

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)
Discussion started by: BeefStu
5 Replies

7. UNIX for Advanced & Expert Users

eval behaviour

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)
Discussion started by: shahnazurs
3 Replies

8. Shell Programming and Scripting

eval misconception

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)
Discussion started by: royalibrahim
1 Replies

9. Shell Programming and Scripting

EVal

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)
Discussion started by: Khoomfire
1 Replies

10. Shell Programming and Scripting

eval a variable that has a .

Hi, Is there any way that I can eval the following - eval abc.csv=def.csv I am getting the - bash: command not found error. thanks. (3 Replies)
Discussion started by: ttshell
3 Replies
Login or Register to Ask a Question