2010-08-28 9 views
8

Sto provando a leggere i comandi da un file di testo ed eseguo ogni riga da uno script bash.linea exec dal file in bash

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

In alcuni casi, se $line contiene i comandi che sono destinati per l'esecuzione in background, ad esempio command 2>&1 & che non si avvia in background, e si svolgerà nel contesto script corrente.

Qualche idea perché?

+3

C'è qualche ragione per cui non puoi semplicemente fare "source commands.txt" invece di scrivere il tuo loop? –

+0

cosa fa "fonte"? Sto cercando di testarlo ora – Quamis

+0

Si prega di consultare [BashFAQ/050] (http://mywiki.wooledge.org/BashFAQ/050). E poi usa 'source' (o' .') come suggerisce Jim Lewis. 'source' fa praticamente quello che dice la prima frase nella tua domanda. –

risposta

7

se tutti i comandi sono all'interno di "commands.txt", in sostanza, è possibile chiamarlo script di shell. Ecco perché puoi o cercarlo o eseguirlo come normale, cioè chmod u + x, quindi puoi eseguirlo usando sh commands.txt

1

Non ho nulla da aggiungere alla risposta di ghostdog74 sul modo giusto di farlo, ma posso capire perché non funziona: la shell analizza i reindirizzamenti I/O, lo sfondo e un sacco di altre cose prima che faccia espansione variabile, quindi entro il tempo $line è sostituito da command 2>&1 & è troppo tardi per riconoscere 2>&1 e & come qualsiasi altra cosa di parametri a command.

È possibile migliorare questo utilizzando eval "$line" ma anche lì si incontrano problemi con comandi multilinea (ad es. Cicli, se blocchi, ecc.). Gli approcci source e sh non presentano questo problema.

Problemi correlati