#!/bin/sh
export BASE=/home/develop/trees
echo $BASE
export PATH=$PATH:$BASE
echo $PATH
下面的命令和结果可以在终端上看到:脚本运行了,但是
~$: ./script.sh
/home/develop/trees
/bin:......:/home/develop/trees
~$: echo $BASE
~$:
怎么了?
预先感谢。
Mirko
#1 楼
export
将变量分配导出到运行export
命令的Shell的子进程。您的命令行环境是脚本外壳程序的父级,因此看不到变量分配。您可以使用
.
(或source
)bash命令在当前外壳程序中执行脚本命令环境并实现您想要的功能,例如source ./script.sh
echo "$BASE"
会产生
/home/develop/trees
source
命令,经常见到在脚本中,是.
的bash同义词,它是POSIX标准的一部分(例如,.
可在破折号中使用,但source
不可用)。. ./script.sh # identical to "source ./script.sh"
(
. script.sh
和source script.sh
首先会在script.sh
中查找PATH
,因此更安全地指定指向script.sh
的路径。)评论
您无需导出即可将变量传递到子shell,子shell是当前shell的副本,包括变量和函数等。导出的变量将复制到从shell产生的新进程中,而不管该进程是否是另一个shell。 。其次, 。是用于采购的POSIX命令。 Bash将源添加为它更易读的同义词,但是您不能依靠它在sh中可用。最后 。 ./script而不是。脚本,如果您想避免意外。 mywiki.wooledge.org/BashFAQ/060
– Geirha
11年7月18日在5:55
请注意,如果您来源脚本并使用管道,则来源环境不可用于父级。例如'source setit.sh'是可以的。 'source setit.sh | tee setit.log'不好。奇怪。不直观。
–gaoithe
16 Sep 8'在11:47
#2 楼
当您运行脚本时,它将在子外壳程序中运行。变量仅在该子shell的上下文中有效。在您的.bashrc
或.profile
中进行设置,然后阅读变量和子外壳。 export
语句可以降低层次结构(当前shell及其所有子shell)的性能,而不像您的示例中那样正常运行。(如果您确实希望脚本影响当前shell的环境),请按以下方式运行它:
. ./script.sh
这会使其在您当前的shell中运行,但也不会在层次结构中传递变量。
#3 楼
我经常想轻松地设置环境变量。这是我添加到.bashrc中以实现此方便的功能。
defect() {
if [ ] && [ -z ]
then
eval 'export DEFECT='
return 0
else
echo 'Usage: defect {number}'
return 1
fi
}
评论
外壳是分层打开的。您可以使用设置父级外壳的var。 ./yourscript.sh