Что делать, если cp: command not found
Иногда возникает простая проблема при создании тасок на шелле — скрипты работают, если запускать их вручную, но не работают, если они запускаются на кроне или в каком-то другом окружении. При этом мы видим такую ошибку:
./task.sh: line 10: cp: command not found
Это происходит из-за того, что в этом окружении есть другие настройки переменной $PATH. Эта переменная указывает путь поиска для обнаружения и выполнения команд без абсолютного пути.
Как подтвердить проблему
Разберем проблему на примере скрипта, который падает на выполнении команды cp. Давайте выполним простую команду, чтобы проверить значение этой переменной:
$ echo $PATH /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
А теперь узнаем, где находится команда cp:
whereis cp cp: /bin/cp
Если запустить вывод переменной $PATH на кроне, то мы сможем подтвердить, что в ней нет папки, в которой находится команда cp.
Как решить проблему
Чтобы заставить скрипт работать на кроне, есть несколько способов. Самый простой — добавить к командам абсолютный путь внутри нашей таски:
cp file /dir # вот это фейлится /bin/cp file /dir # вот это работает
Или переопределить переменную в начале скрипта:
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
Или сделать это в настройке кронтаба до вызова скрипта:
* * * * * PATH=$PATH:/usr/local/bin /path/to/script.sh
TL;DR
Если скрипты, которые запускались вручную, не запускаются на кроне или в другом окружении, скорее всего, проблема в переменной $PATH. Чтобы решить эту проблему, стоит или переопределять значение переменной, или указывать абсолютный путь к командам в теле скрипта.
Этот текст был написан несколько лет назад. С тех пор упомянутые здесь инструменты и софт могли получить обновления. Пожалуйста, проверяйте их актуальность.
Сообщить об опечатке
Текст, который будет отправлен нашим редакторам: