Команда which не возвращает ничего через cron, но работает через консоль
Я написал небольшую утилиту в haXe + Neko, которая должна выполнять некоторые команды GIT. Чтобы избежать жесткого кодирования пути к исполняемому файлу GIT, я бы хотел использовать команду which, чтобы узнать, где он находится. Все работает, как и ожидалось, при запуске вручную из консоли, но не тогда, когда приложение запускается по заданию cron.
Я знаю об ограниченной среде ( здесь или здесь), когда вы запускаете скрипт с использованием cron, но все же удивлен, что это не работает:
/usr/bin/which git >> /home/user/git.txt
Текстовый файл создан, но содержимое пусто. Опять же при запуске из консоли все работает как положено.
Есть идеи? Я использую OS X Leopard, если это поможет.
Спасибо:)
Juan
3 ответа
Если "which" может найти исполняемый файл, то и интерпретатор оболочки, выполняющий вашу команду cron, также может это сделать. Так что я не понимаю, почему вы хотите использовать "что" для этой цели. Но, может быть, у вас есть причина, которая не очевидна.
Команда 'which' использует каталоги, перечисленные в $PATH, для поиска 1-го вхождения команды. Очень вероятно, что PATH не соответствует тому, что вы думаете. Попробуйте добавить '/usr/bin/env >> /home/user/you/env.txt' в ваш crontab, чтобы запустить его сегодня, через одну минуту. Затем загляните в /home/user/you/env.txt, чтобы увидеть, на что был установлен PATH. Если этот PATH не подходит для ваших целей, вам, возможно, придется поместить все свои команды в небольшой сценарий оболочки, где вы можете установить PATH самостоятельно. Вы также можете посмотреть в этом файле env.txt другие экспортированные переменные окружения, поскольку это может пригодиться в зависимости от того, что вы хотите сделать через crontab.
Где на самом деле находится GIT (например, если вы запускаете /usr/bin/which git
с консоли что печатает)? Если он не находится в каталоге в $PATH (это просто /usr/bin и / bin на моей машине Snow Leopard), /usr/bin/which
не найдет его, и вам нужно либо жестко закодировать его, либо добавить строку вроде
PATH=/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/usr/X11/bin
в файл crontab.
Будет ли это сделать трюк?
/usr/bin/env git
Команда env заботится о поиске команды и сама всегда находится в /usr/bin (так мне сказали...) Это распространенная уловка в скриптах Python, необходимая из-за разных дистрибутивов, размещающих python в разных местах, но никто не хочет бездельничать, пытаясь найти где.