exec line from file in bash

0 votes
asked Aug 28, 2010 by quamis

I'm trying to read commands from a text file and execute each line from a bash script.

#!/bin/bash
while read line;    do 
     $line
done < "commands.txt"

In some cases, if $line contains commands that are meant to run in background, eg command 2>&1 & they will not start in background, and will run in the current script context.

Any ideea why?

2 Answers

0 votes
answered Aug 28, 2010 by ghostdog74

if all your commands are inside "commands.txt", essentially, you can call it a shell script. That's why you can either source it, or run it like normal, ie chmod u+x , then you can execute it using sh commands.txt

0 votes
answered Aug 28, 2010 by gordon-davisson

I don't have anything to add to ghostdog74's answer about the right way to do this, but I can cover why it's failing: The shell parses I/O redirections, backgrounding, and a bunch of other things before it does variable expansion, so by the time $line is replaced by command 2>&1 & it's too late to recognize 2>&1 and & as anything other than parameters to command.

You could improve this by using eval "$line" but even there you'll run into problems with multiline commands (e.g. while loops, if blocks, etc). The source and sh approaches don't have this problem.

Welcome to Q&A, where you can ask questions and receive answers from other members of the community.
Website Online Counter

...