Как написать сценарий 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