接收后挂钩中的PATH不包含bashrc中设置的PATH

时间:2019-02-25 16:34:35

标签: bash path git-post-receive

如何在Ubuntu上设置PATH,同时在接收后脚本中设置我设置的变量?目前,我正在通过~/.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 :(得分: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

该路径不足以使脚本解释器找到脚本要运行的可执行文件。无法加载三个单独的可执行文件:lscatdiff。因此,让我们来帮助一下。由于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

Voila!没有更多的错误,因为PATH变量包含允许脚本解释器查找脚本调用的可执行文件所需的所有内容。

另一种方法是告诉PATH对接并指定您自己的可执行文件路径。当您出于某种原因可能不信任或不希望使用“标准”可执行文件时,此方法有时很方便。当以这种方式构建脚本时,我更喜欢为要引用的可执行文件使用变量,这样,如果^ H ^ H当位置更改时,我可以更改变量,而不必在整个脚本中搜索所有变量该可执行文件的调用。

$ 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变量之外的其余可执行文件(如果有)的绝对路径。用途。