Как написать сценарий setevn/export, который будет работать как в csh, так и в bash?

В моей среде (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 ответ

Решение

Не пытайтесь сделать один и тот же скрипт переносимым между двумя совершенно разными оболочками. Трудно добиться даже совместимости 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 или Геррит Папе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
Другие вопросы по тегам