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

Ant*_*ong 5 bash csh

在我的环境 (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 中的同一个文件中获取源文件?

use*_*686 8

不要试图让相同的脚本在两个完全不同的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 中对此进行了测试。


更理智的解决方案:

您可以将设置保留为纯文本,如下所示:

您可以编写一个包装器来设置环境:

  • /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 BernsteinenvdirGerrit 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