Mir*_*oZa 178 bash environment-variables
我编写了以下脚本来在需要时设置一些环境变量。
#!/bin/sh
export BASE=/home/develop/trees
echo $BASE
export PATH=$PATH:$BASE
echo $PATH
Run Code Online (Sandbox Code Playgroud)
在我可以在终端上看到的命令和结果下方:脚本运行,但变量未在最后设置。
~$: ./script.sh
/home/develop/trees
/bin:......:/home/develop/trees
~$: echo $BASE
~$:
Run Code Online (Sandbox Code Playgroud)
怎么了?提前致谢。米尔科
小智 247
export将变量分配导出到export运行命令的 shell 的子进程。您的命令行环境是脚本 shell的父级,因此它看不到变量分配。
您可以使用.(或source)bash命令在当前shell环境中执行脚本命令并实现您想要的,例如
source ./script.sh
echo "$BASE"
Run Code Online (Sandbox Code Playgroud)
会产生
/home/develop/trees
Run Code Online (Sandbox Code Playgroud)
该source命令经常出现在脚本中,是 bash 的同义词.,它是 POSIX 标准的一部分(.例如,在 dash 中可用,但source不是)。
. ./script.sh # identical to "source ./script.sh"
Run Code Online (Sandbox Code Playgroud)
(. script.sh并且source script.sh将首先查找script.shin PATH,因此指定 . 的路径更安全script.sh。)
con*_*use 20
当您运行脚本时,它会在子 shell 中运行。变量仅在该子外壳的上下文中有效。将它们设置在您的.bashrcor 中.profile并阅读 变量和子shell。该export语句适用于层次结构(当前外壳及其所有子外壳),而不是像您的示例中那样。
或者(如果您真的希望脚本影响当前 shell 的环境)将其运行为:
. ./script.sh
Run Code Online (Sandbox Code Playgroud)
这会导致它在您当前的 shell 中运行,但也不会在层次结构中向上传递变量。
小智 7
我经常想轻松设置环境变量。
这是我添加到我的 .bashrc 中以实现这种便利的内容。
defect() {
if [ $1 ] && [ -z $2 ]
then
eval 'export DEFECT=$1'
return 0
else
echo 'Usage: defect {number}'
return 1
fi
}
Run Code Online (Sandbox Code Playgroud)