PATH в хуке post-receive не содержит PATH, как установлено в bashrc
Как я могу установить PATH в Ubuntu таким образом, чтобы его переменные, которые я устанавливаю, также устанавливались в скрипте после получения? В настоящее время я делаю это через ~/.bashrc
файл как это:
export PATH="$PATH:/opt/mssql-tools/bin"
но не вижу никаких изменений в PATH
если я напечатаю это с крючка. Поэтому, если я пытаюсь выполнить соответствующую команду в хуке, я получаю
remote: FileNotFoundError: [Errno 2] No such file or directory: 'sqlcmd': 'sqlcmd'
Поэтому единственное решение, которое я вижу сейчас, - это определение его снова в самом хуке post-receive, например так:
export PATH="$PATH:/opt/mssql-tools/bin"
Есть ли способ лучше?
Спасибо!
1 ответ
Сначала немного о настройке файла:
$ mkdir /tmp/dir1 /tmp/dir2
$ date > /tmp/dir1/foo
$ date > /tmp/dir2/bar
Теперь рассмотрим простой скрипт:
$ chmod 755 foo.sh; cat foo.sh
#!/bin/sh
# intentionally set an inadequate PATH:
export PATH=""
# script to 'ls' two dirs, show that output, and show the diff of the two.
ls /tmp/dir1 > temp1
ls /tmp/dir2 > temp2
echo /tmp/dir1:
cat temp1
echo /tmp/dir2:
cat temp2
diff temp1 temp2
Сценарий правильно сформирован синтаксически, но давайте посмотрим, что произойдет:
$ ./foo.sh
./foo.sh: ls: not found
./foo.sh: ls: not found
/tmp/dir1:
./foo.sh: cat: not found
/tmp/dir2:
./foo.sh: cat: not found
./foo.sh: diff: not found
Путь не достаточен для интерпретатора сценария, чтобы найти исполняемые файлы, которые сценарий хочет запустить. Три отдельных исполняемых файла не загружаются: ls
, cat
, а также diff
, Итак, давайте немного поможем. поскольку ls
как правило, проживает в /bin
каталог, давайте отредактируем PATH
становиться:
export PATH="/bin"
и попробуй еще раз:
$ ./foo.sh
/tmp/dir1:
foo
/tmp/dir2:
bar
./foo.sh: diff: not found
Что ж, ls
работает хорошо сейчас Это прогресс. И с тех пор cat
также живет в /bin, добавив / bin к пути, убившему двух зайцев одним выстрелом. Но diff
до сих пор не найден, потому что diff
живет в /usr/bin. Итак, давайте добавим это к PATH:
export PATH="/bin:/usr/bin"
и попробуй еще раз:
$ ./foo.sh
/tmp/dir1:
foo
/tmp/dir2:
bar
1c1
< foo
---
> bar
Вуаля! Больше ошибок нет, потому что PATH
переменная содержит все необходимое, чтобы позволить интерпретатору сценария находить исполняемые файлы, вызываемые сценарием.
Другой способ заключается в том, чтобы сказать PATH
выбить и указать свой собственный путь к исполняемым файлам. Этот метод иногда удобен, когда по какой-либо причине вы можете не доверять или желать "стандартных" исполняемых файлов. При структурировании сценария таким образом, я предпочитаю использовать переменные для исполняемых файлов, на которые я хочу сослаться, чтобы, если ^H^Hwhen при изменении местоположения, я мог просто изменить переменные и не должен искать весь сценарий для всех вызовы этого исполняемого файла.
$ chmod 755 bar.sh; cat bar.sh
#!/bin/sh
# intentionally set an inadequate PATH:
export PATH=""
# ls lives in /bin:
LS="/bin/ls"
# so does cat:
CAT="/bin/cat"
# but diff lives in /usr/bin:
DIFF="/usr/bin/diff"
# script to 'ls' two dirs, show that output, and show the diff of the two.
$LS /tmp/dir1 > temp1
$LS /tmp/dir2 > temp2
echo /tmp/dir1:
$CAT temp1
echo /tmp/dir2:
$CAT temp2
$DIFF temp1 temp2
И вывод:
$ ./bar.sh
/tmp/dir1:
foo
/tmp/dir2:
bar
1c1
< foo
---
> bar
Вы можете смешивать и сочетать эти подходы, указав PATH
это включает в себя большинство вещей и указание абсолютных путей для других, но ваша проблема возникает потому, что вы этого не сделали.
Вам либо нужно указать полный и адекватный PATH
в вашем скрипте ловушки и / или укажите абсолютные пути к оставшимся исполняемым файлам (если таковые имеются), которые находятся вне PATH
Переменная ваш хук скрипт в настоящее время использует.