前言

在折腾服务器时我会自己安装一些环境,例如jdk,mysql,redis,node,docker等,这些环境我一般是自己制作一个脚本来执行它,例如node环境安装脚本:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
yum install -y tar make
if type node >/dev/null 2>&1; then
echo 'node 已安装'
else
echo 'node 未安装'
fi
echo "----------------------------------start yum install node -----------------------------"
wget https://nodejs.org/dist/v16.14.0/node-v16.14.0-linux-x64.tar.gz
tar -xvf node-v16.14.0-linux-x64.tar.gz
mv node-v16.14.0-linux-x64 /usr/local/node

#删除配置文件中原有的环境变量
sed -ie '/NODE_HOME/d' /etc/profile
sed -ie '/cnpm/d' /etc/profile

#修改node的环境变量,直接写入配置文件
echo "export NODE_HOME=/usr/local/node" >>/etc/profile
echo "export PATH=\$NODE_HOME/bin:\$PATH" >>/etc/profile

source /etc/profile

npm install -g cnpm
echo "export PATH=/usr/local/node/lib/node_moudles/cnpm/bin:$PATH" >>/etc/profile
source /etc/profile

node -v
npm -v
cnpm -v
echo "----------------------------------yum install node success -----------------------------"

每次执行完也都能看到node的版本,但自己手动node -v就不能执行成功提示-bash: node: command not found,每次都要检查脚本是否有问题,误打误撞运行了source /etc/profile,就又成功安装环境,显示版本号了,后面也就不理了。这些天又出现这样的问题,我想是时候找一找根源了。

搜索问题

我在必应上搜索了:为什么sh脚本修改的配置文件不能source,回车就看到了类似问题的答案了:

为什么sh脚本修改的配置文件不能source

原文:解决shell脚本中”source /etc/profile”重载配置文件不生效的问题-腾讯云开发者社区-腾讯云

找到原因了

是因为我使用了sh install-node.sh来执行脚本,这样当前shell进程会分出一个子shell进行来执行node环境安装脚本

子shell只能继承父shell环境变量,不能修改父shell的环境变量

这也是为什么我可以在sh install-node.sh能看到node -v 的版本号,而自己打node -v 提示 command not found

解决

source install-node.sh

凡是脚本中使用source /etc/profile,就要使用命令source install-node.sh执行

参考文章

解决shell脚本中”source /etc/profile”重载配置文件不生效的问题-腾讯云开发者社区-腾讯云