2016-04-01 3 views
0

У меня есть скрипт, который создает кучу вещей. Он создает множество функций, которые находятся в каталоге, из которого выполняется сценарий. т.е.cron: запустить скрипт, который вызывает функцию

/home/me/script.sh 
/home/me/function1 
/home/me/function2 

Если я cd в/дома/меня и запустить ./script.sh все работает отлично. Эти функции используются и выполняют то, что необходимо сделать.

Однако, если я попытаюсь запустить это как задание cron, оно будет работать до тех пор, пока я не попытаюсь передать функции, а затем он просто остановится и процесс завершится (если я запустил его непосредственно из каталог, по крайней мере, я получаю некоторые ошибки).

Как мудрый, если я попытаюсь запустить это из другого каталога, я получаю кучу ошибок. например

cd /opt/ 
/home/me/script.sh 

function1: command not found 
function2: command not found 

Я уверен, что это как-то связано с переменными окружающей среды, но я понятия не имею, какие из них. Я попытался установить (в кронтабе):

PATH=/home/me 
SHELL=/bin/bash 

Но это тоже не работает. Любая помощь приветствуется. Я не хочу жестко кодировать пути к функциям и вместо этого делать их относительно пути, в котором находится скрипт (желательно, тот же каталог).

Пожалуйста, дайте мне знать, если вам нужна дополнительная информация.

+1

показать нам script.sh function1 function2 content, и как вы пишете свой crontab – sigmalha

ответ

1

Вы, вероятно, знаете об этом, но только для того, чтобы быть ясным: A Функция оболочки не имеет пути. Они просто должны быть загружены в текущую оболочку снабжает скрипт, который содержит их:

source /path/to/functions 

или

cd /path/to/functions 
source functions 

Если говорить о программах оболочки (скрипты) вместо этого, то вам нужны учитывать тот факт, что на Unix-подобных ОС, текущая директория никогда не бывает в PATH по умолчанию:

/path/to/functions/function1 

или

cd /path/to/functions 
./function1 

Вы помечено свой вопрос Bash, но учтите, что быть POSIX- совместимы (например, при использовании sh), вы должны использовать ключевое слово . (вместо либо . или source на Bash) и те же ограничения в отношении PATH как для выполнения команды применяются, см dot:

. ./function1