2010-08-28 50 views
8

我想从文本文件中读取命令并从bash脚本执行每一行。执行行从文件中bash

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

在某些情况下,如果$line包含旨在在后台运行的命令,如command 2>&1 &他们不会在后台启动,并会在当前脚本上下文中运行。

任何ideea为什么?

+3

是否有一些原因,你不能只做“source commands.txt”而不是编写自己的循环? – 2010-08-28 01:17:50

+0

“来源”是做什么的?我正在尝试现在测试 – Quamis 2010-08-28 01:20:11

+0

请参阅[BashFAQ/050](http://mywiki.wooledge.org/BashFAQ/050)。然后像Jim Lewis所说的那样使用'source'(或'.')。 'source'几乎可以解决你问题中的第一句话。 – 2010-08-28 01:24:01

回答

7

如果你所有的命令都在“commands.txt”里面,实际上你可以把它叫做shell脚本。这就是为什么你可以源代码或运行它像正常,即chmod u + x,那么你可以使用它执行sh commands.txt

1

我没有任何东西可以添加到ghostdog74的答案正确的方式来做到这一点,但我可以解释为什么它会失败:shell在执行可变扩展之前解析I/O重定向,后台处理和其他一些事情,因此在替换时,将2>&1&识别为其他任何内容太迟比参数command

您可以通过使用eval "$line"来改善这一点,但即使在那里您也会遇到多行命令的问题(例如while循环,if blocks等)。 sourcesh方法没有这个问题。