5

Consider you have a file with some sort of terminal command. How might each line be executed? Can you pipe the output of more into an eval?

%> more ./foo.txt

Edit:

After some help/guidance from the comments, I think I should also make note that it's been a while since I've done any shell scripting, so while I say eval I may mean echo or some other way of executing code.

If foo.txt contains various lines of code, but I want to execute the line that contains echo 'bar bar', I'm looking for a way to do that from, let's say a grep. Something logically similar to:

grep echo foo.txt | xargs echo
vol7ron
  • 505

1 Answers1

8

If you just need to evaluate every line of a file, you don't need a complicated eval or stdout redirection. Two easy options:

  • Source the file (source filename.sh or . filename.sh).
  • Make the file executable and run it (chmod +x filename.sh; ./filename.sh)

If you really need to eval each line of a file in a loop, do it with while:

while IFS= read -r line; do eval "$line"; done < filename.sh

You can also pipe the output of any command to while:

grep foo filename.sh | while IFS= read -r line; do eval "$line"; done

If you need to pass something to source (or .), which expects a file name as an argument, you can use process substitution:

source <( grep foo filename.sh )
slhck
  • 235,242