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 Переменная ваш хук скрипт в настоящее время использует.

Другие вопросы по тегам