我有一个场景,tomcat 用户定义的配置存储在名为tomcat.env
.
我们catalina.sh
获取的值如下:
. "$CATALINA_BASE/bin/setenv.sh"
但由于配置存在于不同的文件中,我尝试添加:
#!/bin/sh
if [ -f ./envvars/tomcat.env ]; then
. ./envvars/tomcat.env
fi
但文件中的值tomcat.env
不会获取到运行catalina.sh
脚本的 shell 中。因此自定义配置尚未设置。
知道为什么会发生这种情况吗?还是我对来源的理解不正确?
文件夹结构
--bin (contains)
-------- catalina.sh
-------- setenv.sh
-------- envvars (contains)
-------------------- tomcat.env
该脚本是从交互式父脚本执行的,该父脚本又调用catalina.sh,并且在catalina.sh中获取了setenv.sh,该脚本在内部获取了tomcat.env。
答案1
您需要从作为相对路径存在的catalina.sh
目录执行。./envvars/tomcat.env
我认为这意味着您必须cd
在执行上面的示例$CATALINA_BASE/bin
之前执行此操作。catalina.sh
但这可能不是您想要的。
或者编辑脚本以通过完整路径setenv.sh
获取文件:tomcat.env
#!/bin/sh
if [ -f "$CATALINA_BASE/bin/envvars/tomcat.env" ]; then
. "$CATALINA_BASE/bin/envvars/tomcat.env"
fi
答案2
我不是 100% 确定你的意思:
但 tomcat.env 文件中的值不会获取到运行 catalina.sh 脚本的 shell 中。
但如果你期望父母交互式外壳您正在执行的catalina.sh
变量将来源到该变量家长shell,那么我大胆猜测是的,你的“对来源的理解不正确”。
当您执行类似 的 shell 脚本时catalina.sh
,并且在源文件中catalina.sh
获取另一个文件时,该源文件中设置的变量(等)将影响catalina.sh
脚本中的环境,但这不会影响您所在的父 shell 的环境。已经执行了catalina.sh
。
如果您需要这些值来影响父 shell,则需要:
- 来源
catalina.sh
而不是执行它,或者 - 来源
setenv.sh
/tomcat.env
直接从交互式 shell 中。
答案3
或者可以选择卢卡斯的回答(其中包含对您的麻烦最可能的解释)您可以使用以下命令(假设脚本是使用 bash 执行的):
#!/bin/bash
CURDIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
if [ -f ${CURDIR}/envvars/tomcat.env ]; then
. ${CURDIR}/envvars/tomcat.env
fi