在我的环境(RHEL)中,我有一堆用 csh 或 bash 编写的脚本。
其中一些用于处理 tomcat 服务器。
我想将 CATALINA_HOME 和 CATALINA_BASE 的定义保存在一个地方,以便 csh 和 bash 脚本可以从一个文件中获取变量。
我更熟悉 bash,对 csh 了解甚少。因此对于 bash 脚本,我将执行以下操作:
. ~/tomcat.settings
在 tomcat.settings 中,我将拥有
export CATALINA_HOME=/mnt/apps/tomcat/6.0.20/linux
export CATALINA_BASE=/home/app1/server
我怎样才能在 csh 中从同一个文件获取资源?
答案1
不要尝试让同一个脚本在两个完全不同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"
我在 bash 4.2.20、tcsh 6.17 和 dash 0.5.7 中对此进行了测试。
更为合理的解决方案:
您可以将设置保留为纯文本,如下所示:
~/tomcat/catalina-home
/mnt/apps/tomcat/6.0.20/linux
你的 bash 脚本
export CATALINA_HOME=$(< ~/tomcat/catalina-home) export CATALINA_BASE=$(< ~/tomcat/catalina-base)
你的 csh 脚本
setenv CATALINA_HOME "`cat ~/tomcat/catalina-home`" setenv CATALINA_BASE "`cat ~/tomcat/catalina-base`"
您可以编写一个包装器来设置环境:
/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 "$@"
如果你有
myscript
,你会像tcat myscript args args args
您可以通过设置包含原始数据的“env 目录”并通过以下方式运行脚本来结合上述两种方法丹·伯恩斯坦的envdir
或者Gerrit Pape 的chpst
:
回显“/mnt/apps/tomcat/6.0.20/linux”>〜/ tomcat-envdir / CATALINA_HOME 回显“ / home / app1 / server”>〜/ tomcat-envdir / CATALINA_BASE
环境目录 ~/tomcat-envdir/myscript
chpst -e ~/tomcat-envdir/myscript