我认为我的问题以前没有被问过(无论如何也不完全是这样,如果有的话,抱歉)。我在 CentOS 7 上使用 Tomcat 7。
在我的 tomcat/bin/setenv.sh 文件中我设置了:
export TEST="test"
然后我通过终端运行 tomcat/bin/startup.sh 启动 tomcat
然后我运行(不是在脚本中,而是在执行 Tomcat 启动脚本后在终端中运行):
echo $TEST
我的问题:我应该能够“回显”变量 TEST 吗?我应该能够看到 TEST 变量已设置为我想要的值(测试)吗?
答案1
不。startup.sh
运行在与您启动它的进程不同的进程中。具体来说,当启动 shell 脚本时,它会在新创建的子外壳当前外壳的。虽然子 shell(以及所有其他进程)在初始化期间确实继承了父进程的环境,但此后,无论哪个方向都不会传播更改。因此,当1startup.sh
发生时,环境更改在命令行中不可见。. setenv.sh
如果你仔细想想,你真的不希望事情朝相反的方向发展。你的工作外壳,一旦你重新控制它,就会被谁知道什么样的环境变化所“污染”。例如,Tomcat 脚本可能会$PATH
在此过程中彻底改变并破坏许多事情。
1实际上startup.sh
调用catalina.sh
,然后获取源setenv.sh
(至少在 Tomcat 7.x 中),但为了简单起见,我们将忽略这一点,因为它不会改变结果。
答案2
该startup.sh
脚本可能会获取setenv.sh
文件来获取变量的值,但如果这样做,则该变量将仅在脚本的环境中设置startup.sh
,而不是在交互式 shell 中设置。
如果您想查看运行时发生的情况startup.sh
,请首先确定它正在使用的 shell 解释器(请参阅#!
文件顶部的 - 行)。
如果是bash
,请运行它
$ bash -x tomcat/bin/startup.sh
(即添加-x
到命令行)
将选项添加-x
到 shell 的调用中将打开脚本的跟踪。