Como escrever um script setevn / export que funcionará tanto em csh quanto em bash?

4

No meu ambiente (RHEL) eu tenho um monte de scripts que são escritos em csh ou bash.

Alguns deles são usados para lidar com um servidor de tomcat.

Eu quero manter as definições de CATALINA_HOME e CATALINA_BASE em um lugar, de modo que o script csh e bash possa originar as variáveis de um único arquivo.

Estou mais familiarizado com o bash e tenho uma exposição muito limitada ao csh. Então, para os scripts bash, é o que farei:

. ~/tomcat.settings

E em tomcat.settings, terei

export CATALINA_HOME=/mnt/apps/tomcat/6.0.20/linux
export CATALINA_BASE=/home/app1/server

Como eu posso usar o mesmo arquivo em csh?

    
por Anthony Kong 03.01.2012 / 01:52

1 resposta

7

Não tente tornar o mesmo script portátil entre dois shells completamente diferentes . Mesmo a compatibilidade de sh e bash é difícil de alcançar, e aqueles usam a mesma sintaxe ... (Eu não posso nem imaginar como se pode ficar csh em primeiro lugar.)

Escreva seu scriptlet de configurações assim:

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"

Eu testei isso no bash 4.2.20, tcsh 6.17 e no traço 0.5.7.

Soluções um pouco mais sensatas:

Você pode manter as configurações como texto simples, assim:

  • ~/tomcat/catalina-home

    /mnt/apps/tomcat/6.0.20/linux
    
  • seus scripts bash

    export CATALINA_HOME=$(< ~/tomcat/catalina-home)
    export CATALINA_BASE=$(< ~/tomcat/catalina-base)
    
  • seus scripts csh

    setenv CATALINA_HOME "'cat ~/tomcat/catalina-home'"
    setenv CATALINA_BASE "'cat ~/tomcat/catalina-base'"
    

Você pode escrever um wrapper que configure o ambiente:

  • /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 "$@"
    
  • se você tivesse myscript , você executaria como tcat myscript args args args

Você poderia combinar as duas abordagens acima configurando um "diretório env" contendo os dados brutos e executando o seu script via envdir de Dan Bernstein ou Gerrit Pape's 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
por 03.01.2012 / 02:20

Tags