如何编写可在csh和bash中使用的setenv / export脚本?


4

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

Answers:


7

不要试图让两个之间的同一个脚本可移植 完全不同 炮弹。甚至sh和bash的兼容性也难以实现,并且那些使用相同的语法......(我甚至无法想象人们如何能够首先站在csh中。)


像这样编写你的设置scriptlet:

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和破折号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 要么 格里特帕佩的 chpst

  • 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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.