2010-06-23 7 views
26

Zum Beispiel dieser Linie versagt:Warum kann ich nicht Unix Nohup mit Bash For-Schleife verwenden?

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

Was ist der richtige Weg, es zu tun ist?

+0

Das "Warum" ist, dass nohup führt seine Argumente mit 'execv()' und 'execv()' ein Argument Vektor, der direkt an den Kernel übergeben wird, nicht los durch irgendeine Schale. Wenn du also eine Shell willst, musst du nohup sagen, dass du selbst eine ausführen sollst. –

Antwort

60

Weil 'nohup' einen Einzelwort-Befehl und seine Argumente erwartet - kein Shell-Loop-Konstrukt. Sie müssten verwenden:

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

Wird dies output.txt für jede Datei schreiben? Wenn es dort wichtige Informationen gibt, die nicht überschrieben werden sollen, würde ich '' '' anstelle von '' 'verwenden. –

+0

Wenn ich wichtige Daten in 'output.txt' habe, würde ich die Ausgabe eines Programms selbst im Append-Modus nicht ausführen. Ich würde eine neue Datei erstellen, und nur wenn ich davon überzeugt war, dass die neuen Daten das waren, was ich wollte, würde ich sie an die Master-Datei anhängen. YMMV, natürlich. –

+0

@ JonathanLeffler, die die Frage jedoch nicht beantwortet. Ich glaube, das wird nur einmal abgeschnitten. –

8

Sie können es in einer Zeile tun, aber Sie möchten es auch morgen tun.

$ 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

Wenn 'loopy.sh' nicht im Pfad ist, müssen Sie es wie' ./ loopy.sh' aufrufen, zumindest auf diesem Red Hat-System, das ich gerade versucht habe mit. – Tshepang

-1

Man könnte auch schreiben, als

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

nicht wirklich. denn wenn die for-Schleife die Logout-Nachricht empfängt, wird sie unterbrochen – Jav

+0

Jup. Nohup muss zuerst da sein, um den Befehl in nohup zu verwenden – Kangarooo

3

Für mich Jonathans Lösung nicht umleiten nicht richtig output.txt. Dieses funktioniert besser:

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