3

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

 2 years ago
source link: https://www.v2ex.com/t/844032
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

V2EX  ›  Linux

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

  uti6770werty · 16 小时 55 分钟前 · 815 次点击

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
10 条回复    2022-03-31 19:20:32 +08:00

duke807

duke807      16 小时 48 分钟前 via Android

你的似乎不準
本來就是立即生效

uti6770werty

uti6770werty      16 小时 45 分钟前

@duke807 在两个步骤之间,我增加过一个 export 输出当前环境变量打印出来,
export PATH="$PATH:/usr/local/mysql/bin:/root"
这条在 shell 的运行过程中,确实没有应用上。。。

stephenyin

stephenyin      16 小时 45 分钟前   ❤️ 1

export PATH="/usr/local/mysql/bin:/root:$PATH"

uti6770werty

uti6770werty      16 小时 20 分钟前

@stephenyin 成功了,搞不懂为啥把变量放后面就可以。。。

stephenyin

stephenyin      16 小时 14 分钟前

@uti6770werty #4 影响查找依赖的顺序,你原来的 $PATH 里应该有一个同名依赖文件。

libook

libook      15 小时 44 分钟前

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

diggzhang      15 小时 38 分钟前

试试这个办法,在脚本正式逻辑执行前将环境变量文件重新 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

MiketsuSmasher      14 小时 23 分钟前

小常识:export PATH 的时候应该把自定义路径放在原有 PATH 的前面
`export PATH=<custom path>:$PATH`

veightz

veightz      14 小时 18 分钟前

可以贴一下具体的报错, 如果是命令找不到的话, 也可以 which 一下看一下

tedding

tedding      8 小时 2 分钟前

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 脚本 执行的。。。因为我也记不住哪个项目对应哪个版本

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK