相关文章推荐
听话的马克杯  ·  CKEditor4.6.2 ...·  5 月前    · 
痴情的雪糕  ·  the type initializer ...·  1 年前    · 
不羁的围巾  ·  【转】Python ...·  1 年前    · 

很多时候我们在执行命令前有很多前置的环境需要设置,所以需要写入一个shell脚本中,希望在执行命令前执行下这个shell就能把环境变量设置好。

比如现在golang开发都打开了go module模式,但在开发 MIT 6.824课程 的时候需要采用原始的gopath的方式进行开发,需要设置以下环节变量

$ cd 6.824
$ export "GOPATH=$PWD"  # go needs $GOPATH to be set to the project's working directory
$ cd "$GOPATH/src/mapreduce"
$ go test -run Sequential
复制代码

同时还需要把GO111MODULE=off

所以写了一个env.sh

#!/bin/bash
export "GOPATH=$PWD"
export "GO111MODULE=off"
echo $GOPATH
复制代码

但执行env.sh之后发现环境变量没有设置

[admin@yjzhuang1583926915193-0 ~/workspace/yanjunz/6.824]$ sh env.sh 
/home/admin/workspace/yanjunz/6.824
[admin@yjzhuang1583926915193-0 ~/workspace/yanjunz/6.824]$ echo $GOPATH
[admin@yjzhuang1583926915193-0 ~/workspace/yanjunz/6.824]$ 
复制代码

这个其实也很好理解,因为sh执行shell脚本的时候,会fork一个新进程出来,shell脚本里面设置的环境变量或者路径只对这个新进程有效,当他执行完这些环境变量或者路径不会影响到当前的shell进程。要解决这个问题需要采用source或者.命令

[admin@yjzhuang1583926915193-0 ~/workspace/yanjunz/6.824]$ . ./env.sh && echo $GOPATH
/home/admin/workspace/yanjunz/6.824
/home/admin/workspace/yanjunz/6.824
复制代码

或者

[admin@yjzhuang1583926915193-0 ~/workspace/yanjunz/6.824]$ source env.sh && echo $GOPATH
/home/admin/workspace/yanjunz/6.824
/home/admin/workspace/yanjunz/6.824
[admin@yjzhuang1583926915193-0 ~/workspace/yanjunz/6.824]$ 
复制代码

source命令又称为点命令,作用:在当前shell环境下读取并执行脚本中的命令,通常用于重新执行刚修改过的初始化文件,使之立即生效,而不必注销并登录

  • shell脚本中cd切换目录失败
  •