PATH в хуке post-receive не содержит PATH, как установлено в bashrc - PullRequest
0 голосов
/ 25 февраля 2019

Как я могу установить PATH в Ubuntu таким образом, чтобы его переменные, которые я устанавливаю, также устанавливались в скрипте после получения?В настоящее время я делаю это с помощью файла ~/.bashrc следующим образом:

export PATH="$PATH:/opt/mssql-tools/bin"

, но не вижу никаких изменений в PATH, если я печатаю его с крючка.Поэтому, если я пытаюсь выполнить рассматриваемую команду в хуке, я получаю

remote: FileNotFoundError: [Errno 2] No such file or directory: 'sqlcmd': 'sqlcmd'

Так что единственное решение, которое я вижу сейчас, это определение его снова в хуке после полученияСам, вот так:

export PATH="$PATH:/opt/mssql-tools/bin"

Есть ли лучший способ?

Спасибо!

1 Ответ

0 голосов
/ 27 февраля 2019

Сначала немного о настройке файла:

$ 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, которую использует ваш скрипт-хук.

...