2010-08-28 35 views
8

Estoy tratando de leer comandos de un archivo de texto y ejecutar cada línea desde un script bash.línea de ejecución del archivo en bash

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

En algunos casos, si $line contiene comandos que están destinados a ejecutar en segundo plano, por ejemplo command 2>&1 & no comenzará en el fondo, y se ejecutará en el contexto de la escritura actual.

Any ideea why?

+3

¿Hay alguna razón por la que no pueda simplemente hacer "source commands.txt" en lugar de escribir su propio bucle? –

+0

¿Qué hace "fuente"? Estoy intentando probarlo ahora – Quamis

+0

Consulte [BashFAQ/050] (http://mywiki.wooledge.org/BashFAQ/050). Y luego usa 'source' (o' .') como sugiere Jim Lewis. 'source' hace más o menos lo que dice la primera oración de tu pregunta. –

Respuesta

7

si todos sus comandos están dentro de "commands.txt", esencialmente, puede llamarlo un script de shell. Es por eso que puede fuente o ejecutarlo normalmente, es decir, chmod u + x, luego puede ejecutarlo usando sh commands.txt

1

No tengo nada que agregar a la respuesta de ghostdog74 sobre la forma correcta de hacerlo, pero puedo explicar por qué está fallando: el shell analiza redirecciones de E/S, fondos y un montón de otras cosas antes de expandir las variables, por lo que cuando $line se reemplaza por es demasiado tarde para reconocer 2>&1 y & como cualquier otra cosa de parámetros a command.

Puede mejorar esto usando eval "$line" pero incluso allí tendrá problemas con los comandos de líneas múltiples (por ejemplo, bucles while, si bloques, etc.). Los enfoques source y sh no tienen este problema.

Cuestiones relacionadas