2010-06-23 25 views
26

Per esempio questa linea fallisce:Perché non posso usare 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 

Qual è il modo giusto per farlo?

+0

Il "perché" è che nohup esegue i suoi argomenti con 'execv()' e 'execv()' accetta un vettore di argomento che è passato direttamente al kernel, non andando attraverso qualsiasi shell. Quindi, se vuoi una shell, devi dire nohup di eseguirne una tu stesso. –

risposta

60

Perché 'nohup' si aspetta un comando a parola singola e i suoi argomenti - non un costrutto del ciclo di shell. Dovresti usare:

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

Scriverà su output.txt per ogni file? Se ci sono informazioni importanti che non vuoi sovrascrivere, userei '>>' invece di '>'. –

+0

Se ho dati importanti in 'output.txt', non eseguirò l'output di un programma anche in modalità append. Vorrei creare un nuovo file, e solo quando ero soddisfatto che i nuovi dati erano ciò che volevo avrei aggiunto al file master. YMMV, ovviamente. –

+0

@ JonathanLeffler che tuttavia non risponde alla domanda. Credo che questo si tronca solo una volta. –

8

Puoi farlo su una riga, ma potresti volerlo fare anche domani.

$ 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 meno che 'loopy.sh' sia nel percorso, devi invocarlo come'./Loopy.sh', almeno su questo sistema Red Hat ho appena provato con. – Tshepang

-1

Si potrebbe anche scrivere come

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

non proprio. perché se il ciclo for riceve il messaggio di logout, verrà interrotto – Jav

+0

Jup. Nohup deve essere il primo da quando è necessario utilizzare il comando in nohup – Kangarooo

3

Per me, la soluzione di Jonathan non reindirizza correttamente output.txt. Questo funziona meglio:

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

Problemi correlati