Что делать, если 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. Чтобы решить эту проблему, стоит или переопределять значение переменной, или указывать абсолютный путь к командам в теле скрипта.


Подпишитесь на Хайлоад с помощью Google аккаунта
или закройте эту хрень