Why can't I use Unix Nohup with Bash For-loop?

35,699

Solution 1

Because 'nohup' expects a single-word command and its arguments - not a shell loop construct. You'd have to use:

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

Solution 2

You can do it on one line, but you might want to do it tomorrow too.

$ 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 &

Solution 3

For me, Jonathan's solution does not redirect correctly to output.txt. This one works better:

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

Share:
35,699
Danf
Author by

Danf

Updated on February 28, 2020

Comments

  • Danf
    Danf about 4 years

    For example this line fails:

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

    What's the right way to do it?

  • tshepang
    tshepang about 11 years
    Unless loopy.sh is in the path, you need to invoke it like ./loopy.sh, at least on this Red Hat system I just tried with.
  • Climbs_lika_Spyder
    Climbs_lika_Spyder over 9 years
    Will this be writing over output.txt for each file? If there is important information in there that you do not want overwritten, I would use >> instead of >.
  • Jonathan Leffler
    Jonathan Leffler over 9 years
    If I have important data in output.txt, I would not run the output of a program into it even in append mode. I would create a new file, and only when I was satisfied that the new data was what I wanted would I append it to the master file. YMMV, of course.
  • Brian Hannay
    Brian Hannay over 6 years
    @JonathanLeffler that doesn't answer the question though. I believe this only truncates once.