在我的环境 (RHEL) 中,我有一堆用 csh 或 bash 编写的脚本。
其中一些用于处理tomcat服务器。
我想将 CATALINA_HOME 和 CATALINA_BASE 的定义保留在一个地方,以便 csh 和 bash 脚本可以从一个文件中获取变量。
我更熟悉 bash,对 csh 的接触非常有限。所以对于 bash 脚本,这就是我要做的:
. ~/tomcat.settings
Run Code Online (Sandbox Code Playgroud)
在 tomcat.settings 中,我将有
export CATALINA_HOME=/mnt/apps/tomcat/6.0.20/linux
export CATALINA_BASE=/home/app1/server
Run Code Online (Sandbox Code Playgroud)
如何从 csh 中的同一个文件中获取源文件?
不要试图让相同的脚本在两个完全不同的shell之间移植。甚至 sh 和 bash 的兼容性也很难实现,而且它们使用相同的语法......(我什至无法想象人们一开始怎么能忍受 csh。)
像这样编写您的设置脚本:
test "$?BASH_VERSION" = "0" || eval 'setenv() { export "$1=$2"; }'
setenv CATALINA_HOME "/mnt/apps/tomcat/6.0.20/linux"
setenv CATALINA_BASE "/home/app1/server"
Run Code Online (Sandbox Code Playgroud)
我在 bash 4.2.20、tcsh 6.17 和 dash 0.5.7 中对此进行了测试。
更理智的解决方案:
您可以将设置保留为纯文本,如下所示:
~/tomcat/catalina-home
/mnt/apps/tomcat/6.0.20/linux
Run Code Online (Sandbox Code Playgroud)你的 bash 脚本
export CATALINA_HOME=$(< ~/tomcat/catalina-home)
export CATALINA_BASE=$(< ~/tomcat/catalina-base)
Run Code Online (Sandbox Code Playgroud)你的 csh 脚本
setenv CATALINA_HOME "`cat ~/tomcat/catalina-home`"
setenv CATALINA_BASE "`cat ~/tomcat/catalina-base`"
Run Code Online (Sandbox Code Playgroud)您可以编写一个包装器来设置环境:
/usr/bin/tcat
#!/bin/sh
# you can use any, *any* language for this one
export CATALINA_HOME=/mnt/apps/tomcat/6.0.20/linux
export CATALINA_BASE=/home/app1/server
exec "$@"
Run Code Online (Sandbox Code Playgroud)如果你有myscript,你会像tcat myscript args args args
您可以通过设置包含原始数据的“env 目录”并通过Dan Bernsteinenvdir或Gerrit Papechpst运行脚本来组合上述两种方法:
echo "/mnt/apps/tomcat/6.0.20/linux" > ~/tomcat-envdir/CATALINA_HOME echo "/home/app1/server" > ~/tomcat-envdir/CATALINA_BASE
envdir ~/tomcat-envdir/ myscript
chpst -e ~/tomcat-envdir/ myscript