Вот фрагмент из скрипта, который я обычно выполняю из cron:
if [ "$RESCAN_COMMAND" = "wipecache" ]; then
log "Linking cover art."
find $FLAC_DIR -name "*.jpg" | while read f; do c=`echo $f | sed -e 's/flac/mp3/g'`; ln -s "$f" "$c"; done
log "Done linking cover art"
fi
Скрипт отлично работает при запуске из командной строки. Но когда запускается cron (как тот же пользователь), он терпит неудачу где-то в строке find
. Сообщение «Готово» не регистрируется, и сценарий не продолжается после блока if
.
Строка find
создает ссылки из файлов, таких как flac/Artist/Album/cover.jpg
до mp3/Artist/Album/cover.jpg
. Есть несколько сотен файлов для ссылки. Команда генерирует большую часть выходных данных для stderr
, потому что большинство, если не все ссылки уже существуют.
На догадку я попытался перенаправить stderr
команды ln
на /dev/null
:
find $FLAC_DIR -name "*.jpg" | while read f; do c=`echo $f | sed -e 's/flac/mp3/g'`; ln -s "$f" "$c" 2>/dev/null; done
С этим изменением скрипт успешно выполняется из cron (а также из командной строки).
Мне было бы интересно понять, почему.