在 Shell 脚本里,如何在脚本的运行过程中,马上应用新的$PATH 环境变量?

2022-03-31 10:27:19 +08:00
 uti6770werty

CentOS7
如:

testsh:sh 内容
sed -i '$a\export PATH="$PATH:/usr/local/mysql/bin:/root"' /etc/profile
export PATH="$PATH:/usr/local/mysql/bin:/root"
# 上面是添加了新环境变量

# 以下此命令,需要具有环境变量 /usr/local/mysql/bin 在 PATH 里
# 但是在 shell 里,似乎上面的 export PATH 是没有应用上的,
# 请问应该如何马上起效呢?
/usr/local/mysql/bin/mysql_secure_installation
2594 次点击
所在节点    Linux
10 条回复
duke807
2022-03-31 10:34:17 +08:00
你的似乎不準
本來就是立即生效
uti6770werty
2022-03-31 10:37:36 +08:00
@duke807 在两个步骤之间,我增加过一个 export 输出当前环境变量打印出来,
export PATH="$PATH:/usr/local/mysql/bin:/root"
这条在 shell 的运行过程中,确实没有应用上。。。
stephenyin
2022-03-31 10:37:54 +08:00
export PATH="/usr/local/mysql/bin:/root:$PATH"
uti6770werty
2022-03-31 11:02:19 +08:00
@stephenyin 成功了,搞不懂为啥把变量放后面就可以。。。
stephenyin
2022-03-31 11:08:57 +08:00
@uti6770werty #4 影响查找依赖的顺序,你原来的 $PATH 里应该有一个同名依赖文件。
libook
2022-03-31 11:38:14 +08:00
export 指令会在当前 Shell 会话中立即生效。

Shell 会使用 PATH 环境变量的值从左到右每个目录查找是否有相应的指令文件存在,你原$PATH 拼在左边就会被先搜索,拼在右边就会被后搜索,搜索到第一个匹配的项就停止搜索。

你可以做个试验:
cd /tmp
mkdir a
mkdir b
echo "echo a">a/e
echo "echo b">b/e
chmod +x a/e
chmod +x b/e
export PATH=/tmp/a:$PATH:/tmp/b

然后你执行 e ,看输出的是 a 还是 b 。

你拼左侧不起作用可能是左侧的目录中已经存在 mysql_secure_installation 这个名称的文件了。

想要检查某个指令当前在 PATH 环境变量中的位置,可以用 which 指令,如`which mysql_secure_installation`。
diggzhang
2022-03-31 11:44:32 +08:00
试试这个办法,在脚本正式逻辑执行前将环境变量文件重新 export:

```shell
#argumaents 1=abs_file_path
function export_from_file() {
while read LINE; do export "$LINE"; done < $1
}

export_from_file /path/to/envfile
```
MiketsuSmasher
2022-03-31 12:59:12 +08:00
小常识:export PATH 的时候应该把自定义路径放在原有 PATH 的前面
`export PATH=<custom path>:$PATH`
veightz
2022-03-31 13:04:32 +08:00
可以贴一下具体的报错, 如果是命令找不到的话, 也可以 which 一下看一下
tedding
2022-03-31 19:20:32 +08:00
ProjectPath=$HOME/Documents/Workspace/Path/To/Project
NODE=$HOME/.nvm/versions/node/v16.14.2

export PATH=$NODE/bin:$PATH
cd $ProjectPath
npm run start:prep


不同项目的 node 版本不同 我是用 shell 脚本 执行的。。。因为我也记不住哪个项目对应哪个版本

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/844032

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX