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 <开发者_如何学JAVA; "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?
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
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.
精彩评论