2010-08-28 22 views
8

Bir metin dosyasından komutları okumaya ve her satırı bir bash komut dosyasından yürütmeye çalışıyorum. Bazı durumlarda exec satırından dosya satırı

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

, $line arka planda çalışmasına içindir komutları, örneğin içeriyorsa command 2>&1 & arka planda başlamaz ve geçerli komut bağlamında çalışır.

Neden herhangi bir ideea?

+3

Kendi döngüsünü yazmak yerine "source commands.txt" yapamayacağınızın bir nedeni var mı? –

+0

"source" ne yapıyor? Şimdi test etmeye çalışıyorum – Quamis

+0

Lütfen [BashFAQ/050] 'e bakınız (http://mywiki.wooledge.org/BashFAQ/050). Ve sonra Jim Lewis'in önerdiği gibi 'source' (veya' .') kullanın. 'source' sorgunuzdaki ilk cümlenin ne dediğini hemen hemen söyler. –

cevap

7

tüm komutları "commands_file" içeride olup olmadığını, esasen, bir kabuk komut dosyası diyebiliriz. Bu nedenle, kaynak ya da normal gibi, yani chmod u + x çalıştırabilirsiniz, sonra sh commands.txt

1

kullanarak çalıştırabilirsiniz Ghostdog74'ın bunu yapmak için doğru yolu hakkında eklemek için bir şey yok, ama neden başarısız olduğunu kapsayabilir: Kabuk, değişken genişletme yapmadan önce I/O yönlendirme, arka plan ve başka şeyler bir demet ayrıştırır, bu nedenle $line2>&1 ve & başka bir şey olarak tanımak için çok geç command 2>&1 &command parametrelerine göre.

Bunu, eval "$line" kullanarak geliştirebilirsiniz, ancak burada bile çok satırlı komutlarla (örneğin, döngüler, bloklar vb.) Sorunlarla karşılaşabilirsiniz. source ve sh yaklaşımları bu soruna sahip değildir.

İlgili konular