2013-03-18 3 views
2

Я пишу сценарий оболочки для установки переменных среды, значения которых доступны в файле. Ниже приведен сценарий оболочки Я написал,Сценарий оболочки для настройки переменной среды

VARIABLE_FILE=env-var.dat 
if [ -f ${VARIABLE_FILE} ] ; then 
    . ${VARIABLE_FILE} 
    if [ ! -z "${TEST_VAR1}" ] ; then 
     export TEST_VAR1="${TEST_VAR1}" 
    fi 
    if [ ! -z "${TEST_VAR2}" ] ; then 
     export TEST_VAR2="${TEST_VAR2}" 
    fi 
fi 

Приведенный выше код работает только в Баш оболочки, так как я использовал команду экспорта, чтобы установить переменную окружения, и он терпит неудачу, если я использовал его с любой другой оболочкой. Есть ли какая-либо команда для установки переменной среды, которая работает в любой оболочке?

+0

Для какие значения «любого»? – choroba

+0

bash, tcsh, ksh, ... – Mojoy

ответ

3

«причудливая» оболочка, как Баш и разрешение на ЗШ установить переменную и экспортировать его в качестве переменного окружения, в то же время, как так:

export FOO=bar 

Со стандартной POSIX оболочки Борна, эквивалент достигаются делая это в двух командах:

FOO=bar 
export FOO 

Обратите внимание, что, как только вы экспортировали переменную, вы можете сбросить его на другое значение в сценарии, и он по-прежнему экспортируется (вам не нужно экспортировать его снова). Кроме того, вы можете экспортировать несколько переменных одновременно:

FOO=bar 
BAZ=quux 
export FOO BAZ 

Вы упомянули Tcsh в свой комментарий, но CSH и производные полностью отличаются от Bourne на основе оболочек (и не рекомендуется для использования!). Вы редко можете сделать сценарий оболочки совместимым с sh и csh в одно и то же время. Для csh, посмотрите на setenv

0

Если вы действительно хотите, чтобы это произошло, это можно сделать, но это сложно. Один из способов сделать это - использовать awk для вывода правильного синтаксиса и оценки текста, возвращаемого с awk. Чтобы поделиться одним файлом значений переменной среды между основными sh и csh, следующая команда в файле импортирует файл переменной в среду: (да, да, это одна огромная линия из-за негибкого способа, которым обрабатывают некоторые оболочки . кавычку Если вы не против того, файл .awk тоже можно использовать AWK -f ...)

eval `awk '{ var = $1; $1=""; val=substr($0,2); if (ENVIRON["SHELL"] ~ /csh$/) { print "setenv", var, " \"" val "\";" } else { print var "=\"" val "\"" ; print "export", var }}' $HOME/env_value_file` 

файл значение переменной в этом формате:

FOO value for foo 
BAR foo bar 
BAZ $BAR plus values $FOO 

Design примечания для образовательных целей:

  1. В awk нет простого способа доступа к полям 2-NF, поэтому, если бы могли быть пробелами в наших значениях переменных, нам нужно изменить $ 1, чтобы получить $ 0, чтобы приблизиться к желаемому значению.
  2. Чтобы это сработало, поскольку переменная SHELL всегда задана, но не как переменная среды , а не с последовательной капитализацией, вы должны влачить переменную окружения SHELL из значения оболочки, как показано ниже. как переменная среды, прежде чем использовать скрипт.
  3. Кроме того, если вы хотите, чтобы новые значения среды присутствовали после сценария среды импорта , вам необходимо указать сценарий среды.
  4. Если оболочка не работает хорошо, вам придется настроить скрипт.

для Bourne вкусов оболочки (Башк, ш, КШ, ЗШ):

export SHELL 
. import_environment 

Для CSH вкусов: (переменная оболочки имеет тенденцию быть ниже, случай CSH оболочек)

setenv SHELL "$shell" 
source import_environment 
Смежные вопросы