Сначала немного о настройке файла:
$ 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
, которую использует ваш скрипт-хук.