Почему я не могу использовать Unix Nohup с Bash For-loop?

#linux #bash #unix #nohup

#linux #bash #unix #nohup

Вопрос:

Например, эта строка завершается ошибкой:

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

Как правильно это сделать?

Комментарии:

1. «Почему» заключается в том, что nohup выполняет свои аргументы с помощью execv() и execv() принимает вектор аргументов, который передается непосредственно ядру, не проходя ни через какую оболочку. Таким образом, если вам нужна оболочка, вам нужно сказать nohup, чтобы он выполнил ее самостоятельно.

Ответ №1:

Потому что ‘nohup’ ожидает команду из одного слова и ее аргументы, а не конструкцию цикла оболочки. Вам пришлось бы использовать:

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

Комментарии:

1. Будет ли это перезапись output.txt для каждого файла? Если там есть важная информация, которую вы не хотите перезаписывать, я бы использовал >> вместо > .

2. Если у меня есть важные данные в output.txt , я бы не запускал в них вывод программы даже в режиме добавления. Я бы создал новый файл, и только когда я был бы удовлетворен тем, что новые данные соответствуют моим желаниям, я бы добавил их к основному файлу. YMMV, конечно.

3. @JonathanLeffler однако это не отвечает на вопрос. Я полагаю, что это усекается только один раз.

Ответ №2:

Для меня решение Джонатана некорректно перенаправляет на output.txt. Этот работает лучше:

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

Ответ №3:

Вы можете сделать это в одной строке, но, возможно, захотите сделать это и завтра.

 $ 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 amp;
  

Комментарии:

1. Если loopy.sh это не указано в path, вам нужно вызвать его следующим образом ./loopy.sh , по крайней мере, в этой системе Red Hat, с которой я только что попробовал.