如何编写一个可以在 csh 和 bash 中运行的 setevn/export 脚本?

如何编写一个可以在 csh 和 bash 中运行的 setevn/export 脚本?

在我的环境(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

相关内容