2010-08-28 38 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方法沒有這個問題。