2010-06-23 14 views
26

Por ejemplo, esta línea de falla:¿Por qué no puedo usar Unix Nohup con Bash For-loop?

$ nohup for i in mydir/*.fasta; do ./myscript.sh "$i"; done > output.txt& 
-bash: syntax error near unexpected token `do 

Cuál es la forma correcta de hacerlo?

+0

El "por qué" es que nohup ejecuta sus argumentos con 'execv()' y 'execv()' toma un vector de argumento que se pasa directamente al núcleo, no va a través de cualquier caparazón. Por lo tanto, si quieres un caparazón, necesitas decirle a nohup que ejecute uno. –

Respuesta

60

Porque 'nohup' espera un comando de una sola palabra y sus argumentos, no una construcción de bucle de shell. Tendrías que usar:

nohup sh -c 'for i in mydir/*.fasta; do ./myscript.sh "$i"; done >output.txt' & 
+1

¿Escribirá esto sobre output.txt para cada archivo? Si hay información importante allí que no desea sobrescribir, usaría '>>' en lugar de '>'. –

+0

Si tengo datos importantes en 'output.txt', no ejecutaría la salida de un programa incluso en modo de adición. Crearía un nuevo archivo, y solo cuando estuviera satisfecho de que los nuevos datos eran lo que quería, lo anexaría al archivo maestro. YMMV, por supuesto. –

+0

@JonathanLeffler que no responde la pregunta sin embargo. Creo que esto solo trunca una vez. –

8

Puedes hacerlo en una línea, pero es posible que también quieras hacerlo mañana.

$ cat loopy.sh 
#!/bin/sh 
# a line of text describing what this task does 
for i in mydir/*.fast ; do 
    ./myscript.sh "$i" 
done > output.txt 
$ chmod +x loopy.sh 
$ nohup loopy.sh & 
+3

A menos que 'loopy.sh' esté en la ruta, necesita invocarlo como'./Loopy.sh', al menos en este sistema Red Hat que acabo de probar con. – Tshepang

-1

También puede escribir como

for i in mydir/*.fasta; do nohup ./myscript.sh "$i" > output.txt; done & 
+2

no realmente. porque si el ciclo for recibe el mensaje de cierre de sesión, se interrumpirá – Jav

+0

Jup. Nohup necesita ser el primero ya que es necesario usar el comando en nohup – Kangarooo

3

Para mí, la solución de Jonathan no redirige correctamente a Output.txt. Esto funciona mejor:

nohup bash -c 'for i in mydir/*.fasta; do ./myscript.sh "$i"; done' > output.txt &

Cuestiones relacionadas