#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, с которой я только что попробовал.