如何在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"
有更好的方法吗?
谢谢!
答案 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
该路径不足以使脚本解释器找到脚本要运行的可执行文件。无法加载三个单独的可执行文件: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
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
变量之外的其余可执行文件(如果有)的绝对路径。用途。