скрипт не работает в crontab

Я заметил, что ряд подобных вопросов задал, и я также попробовал опубликованные предложения, но я просто не могу заставить это работать. Ниже мой код.

#!/bin/bash while IFS="" read -d "" -r filename; do filearray[i++]="$filename" done < <(find . -maxdepth 1 -type f -iname "*.txt" -print0) printf '%s\n' "${filearray[0]}" 

Просто я просто хочу искать все файлы типа txt в определенном каталоге и помещать их в массив, который отображается в конце. Когда я бегу из командной строки, проблем нет. Это работает хорошо. Как только я выполню это через crontab, я получаю следующую ошибку:

 syntax error near unexpected token `<' `done < <(find . -maxdepth 1 -type f -iname "*.txt" -print0)' 

Вот сама запись cron:

 * * * * * . /usr/online/scripts/test.sh 2>> /usr/online/scripts/log/test.log 

Почему скрипт работает в командной строке, но не crontab? Я объявляю оболочку, поэтому, конечно, crontab должен использовать оболочку? Есть ли другая причина, почему я могу это сделать?

Джэкки

command < <(other command) – это багизм . Поскольку вы указываете строку shebang, вы не должны указывать оболочку в своем crontab; это просто сбивает с толку. Вы должны сделать то или другое – я очень предпочитаю линию shebang, потому что вы явно указываете на синтаксис, который следует, вместо того, чтобы притворяться «универсальным» сценарием оболочки.

О, и убедитесь, что вы делаете свой исполняемый файл сценария и помещаете в поле команды crontab только /path/to/your/script.sh , а не sh /path/to/your/script.sh , sh < /path/to/your/script.sh или даже . /path/to/your/script.sh . /path/to/your/script.sh . Последние три игнорируют строку shebang и вместо этого запускают скрипт в контексте оболочки cron, независимо от того, что было настроено.

Подробнее о сохранении вывода сценария в файл см. Инструкции перенаправления .

Предполагая, что скрипт является исполняемым и делает правильную вещь при вызове из командной строки, напишите запись crontab следующим образом (для запуска каждые 15 минут):

 */15 * * * * /path/to/script.sh >/path/to/output 2>/path/to/errors