Почему FOO=bar; экспортировать переменную в мою среду

prueba el siguiente código.

#!/bin/bash
var=$(df -h | sed -n 2p |awk '{ print $4 }')
if [ "${var}" le "15" ]
then
./bin/dss stop
rm -rf tmp/*
rm -rf caches/*
./bin/dss start
fi
4
22.06.2019, 03:59
2 ответа

Существует ряд вариантов для рассмотрения:

  1. Просто выполнение FOO=barсоздает переменную с именем FOOсо значением bar, но эта переменная не передается новым процессам:

    $ echo $FOO
    $ FOO=bar
    $ echo $FOO
    bar
    $ bash        # Start a new bash process
    $ echo $FOO
                  # Variable is not set in the new process
    $ exit        # Exit new bash process
    
  2. Запуск FOO=bar <command>запустит данную команду с набором переменных (, но не повлияет на исходную среду оболочки):

    $ echo $foo
    $ FOO=baz bash   # start a new bash process
    $ echo $FOO
    baz
    $ exit           # exit the new bash process
    exit
    $ echo $FOO      
                     # No FOO in the original bash process
    $
    
  3. Выполнение FOO=foo; <command>эквивалентно (1 ); помещение точки с запятой между двумя командами эквивалентно запуску этих двух команд в двух отдельных строках:

    $ FOO=foo; echo $FOO
    foo
    $ bash
    $ echo $FOO
    
    $ exit
    exit
    $ echo $FOO
    foo
    $
    
  4. Использование exportприведет к передаче переменной в среде оболочки вновь -созданным процессам:

    $ export FOO=bar
    $ echo $FOO    # Value set in original shell
    bar
    $ bash         # Start another shell
    $ echo $FOO
    bar            # Value was passed along to new process
    $ exit
    exit
    
12
27.01.2020, 20:44

Нет, FOO=бар; не экспортирует переменную в мою среду

Переменная устанавливается в (текущей )среде, только если она была ранее экспортирована:

$ export foo
$ foo=bar
$ env | grep foo
foo=bar

Переменная устанавливается в окружении команды, когда она помещается перед командой. Например foo=bar command. И он существует только во время выполнения команды.

$ foo=bar bash -c 'echo "foo is = $foo"'
foo is = bar

Переменная не установлена ​​для командной строки (в настоящей оболочке):

$ foo=bar bash -c echo\ $foo

Выше значение $fooзаменяется ничем на текущую работающую оболочку , поэтому :не выводится.

Ваша команда:

$ FOO=bar docker run -it -e FOO=$FOO debian env

преобразуется в фактическую строку:

$ FOO=bar docker run -it -e FOO= debian env

текущей работающей оболочкой .

Если вместо этого вы установите переменную (в текущей запущенной оболочке )с помощью foo=barперед запуском команды, строка будет преобразована в:

$ FOO=bar; docker run -it -e FOO=bar debian env

Переменная, установленная для среды команды, стирается, когда команда возвращает значение:

$ foo=bar bash -c 'echo'; echo "foo was erased: \"$foo\""

За исключением , когда команда является встроенной в некоторых условиях/оболочках:

$ ksh -c 'foo=bar typeset baz=quuz; echo $foo'
bar
20
27.01.2020, 20:44

Теги

Похожие вопросы