我创建了一个 bash 脚本来运行一些具有自定义环境变量的其他程序。这是我命名run-hello.sh
的第一个脚本/home/user
#!/bin/bash
export PATH=$PATH":/home/user/cool/path"
hello.sh
exit 0
在/home/user/cool/path
我有hello.sh
脚本:
#\!/bin/bash
echo Hello from $(pwd)
运行第一个脚本(run-hello.sh)产生:
Hello from /home/user
我的问题:
第一个脚本中的
export
调用仅在脚本处于活动状态的持续时间内有效?如果在运行脚本后我echo $PATH
不会看到脚本添加的路径......这是预期的行为吗?我怎样才能让它至少在终端的持续时间内存在?为什么结果打印
/home/user
而不是/home/user/cool/path
?
首先,您需要考虑的是,当您在 shell 下启动某个 shell 脚本时,您的 shell 将派生一个新的 shell(我们称之为子 shell)来执行脚本的命令。
然后 man bash 告诉:
因此,当您第一次导出 . 时
PATH
,它的新值将成为您的子 shell 环境的一部分,并且可供它将触发的任何子进程使用。(例如 hello.sh)因此,如果您
echo $PATH
在运行 hello.sh 后立即运行,应该会显示更新后的值。但是,你退出你的外壳!(执行 run-hello.sh 的子 shell 终止)它的某个祖先(很可能是您启动 run-hello.sh 的 shell)收回控制权,但完全不知道 run-hello.sh 环境摆弄。
所以,是的,这确实是预期的行为。
现在,启动时任务的当前工作目录是从其父级继承的。它不会自动更改为程序所在的目录。
所以我必须怀疑您的调用
run-hello.sh
是从/home/user
目录中进行的。总而言之:任何导出变量的生命周期都等于负责导出的任务的生命周期,并且任务本身及其所有子项(在启动时)的有效性得到保证。