Могу ли я экспортировать переменную в среду из сценария bash без ее поиска?

предположим, что у меня есть этот скрипт

экспорт.Баш :

#! /usr/bin/env bash
export VAR="HELLO, VARIABLE"

когда я выполняю скрипт и пытаюсь получить доступ к $VAR Я не получаю никакого значения !

echo $VAR

есть ли способ получить доступ к $VAR выполняется экспорт.Баш без поиска его ?

7 ответов


есть ли способ получить доступ к $VAR выполняется export.bash без поиска его ?

быстрый ответ: Нет.

но есть несколько возможных путей их устранения.

самый очевидный, о котором вы уже упоминали, - использовать source или . для выполнения скрипта в контексте вызывающей оболочки:

$ cat set-vars1.sh 
export FOO=BAR
$ . set-vars1.sh 
$ echo $FOO
BAR

другой способ - иметь скрипт, а не устанавливать переменную среды, печатать команды, которые зададут переменную окружения:

$ cat set-vars2.sh
#!/bin/bash

echo export FOO=BAR
$ eval $(./set-vars2.sh)
$ echo $FOO
BAR

отметим, что $(...) объединит вывод в одну строку. Если у вас есть несколько вещей, которые нужно установить, вы должны добавить точки с запятой к напечатанным командам, чтобы они были действительны после объединения.

третий подход состоит в том, чтобы иметь сценарий, который устанавливает переменную(ы) среды внутри, а затем вызывает указанную команду с этой средой:

$ cat set-vars3.sh
#!/bin/bash

export FOO=BAR
exec "$@"
$ ./set-vars3.sh printenv | grep FOO
FOO=BAR

этот последний подход может будьте очень полезны, хотя это неудобно для интерактивного использования, так как он не дает вам настройки в вашей текущей оболочке (со всеми другими настройками и историей, которую вы создали).


для того, чтобы экспортировать переменную VAR сначала наиболее логичным и, кажется, работающим способом является источник переменной:

. ./export.bash

или

source ./export.bash

теперь, когда эхо от основной оболочки работает

 echo $VAR
HELLO, VARABLE

теперь мы сбросим VAR

export VAR=""
echo $VAR

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

./test-export.sh 
HELLO, VARABLE
--
.

код: cat test-export.sh

    #!/bin/bash
    # Source env variable
    source ./export.bash

    # echo out the variable in test script
    echo $VAR

    # unset the variable 
    unset VAR
    # echo a few dotted lines
    echo "---"
    # now return VAR which is blank
    echo $VAR

вот один из способов

обратите внимание: экспорт ограничен скриптом, который выполняет экспорт в вашей основной консоли - так как задание cron я бы добавил его как консоль, как показано ниже... для командной части все еще сомнительно: вот как вы будете работать из своей оболочки:

в командной строке (до тех пор, пока экспорт.bash имеет несколько значений Эха)

IFS=$'\n'; for entries in $(./export.bash); do  export $entries;  done; ./v1.sh 
HELLO THERE
HI THERE

кошка v1.sh

#!/bin/bash
echo $VAR
echo $VAR1

теперь покуда это для вашего использования - вы смогли сделать переменные, доступные для ваших скриптов в любое время, делая псевдоним bash следующим образом:

myvars ./v1.sh
HELLO THERE
HI THERE

echo $VAR

.

добавить это к вашему .bashrc и

function myvars() { 
    IFS=$'\n'; 
    for entries in $(./export.bash); do  export $entries;  done; 

    "$@"; 

    for entries in $(./export.bash); do variable=$(echo $entries|awk -F"=" '{print }'); unset $variable;
done

}

source ваш файл bashrc, и вы можете сделать, как указано выше, в любое время ...

абы обратно к остальным..

это сделало его доступным глобально, а затем выполнило сценарий..

просто эхо его затем запустить экспорт на Эхо !

экспорт кота.удар

#!/bin/bash
echo "VAR=HELLO THERE"

теперь в скрипте или консоли запустите:

 export "$(./export.bash)"

попробуй:

echo $VAR
HELLO THERE

несколько значений, пока вы знаете, что вы ожидаете в другом скрипте, используя вышеуказанный метод:

экспорт кота.Баш

#!/bin/bash
echo "VAR=HELLO THERE"
echo "VAR1=HI THERE"

кошка test-export.sh

#!/bin/bash

IFS=$'\n'
for entries in $(./export.bash); do
   export $entries
done

echo "round 1"
echo $VAR
echo $VAR1

for entries in $(./export.bash); do
     variable=$(echo $entries|awk -F"=" '{print }');
     unset $variable
done

echo "round 2"
echo $VAR
echo $VAR1

теперь результаты

 ./test-export.sh 
round 1
HELLO THERE
HI THERE
round 2


.

и окончательное окончательное обновление для автоматического назначения читать переменные:

./test-export.sh 
Round 0 - Export out then find variable name - 
Set current variable to the variable exported then echo its value
$VAR has value of HELLO THERE
$VAR1 has value of HI THERE
round 1 - we know what was exported and we will echo out known variables
HELLO THERE
HI THERE
Round 2 - We will just return the variable names and unset them 
round 3 - Now we get nothing back

в скрипт: кошка test-export.sh

#!/bin/bash

IFS=$'\n'
echo "Round 0 - Export out then find variable name - "
echo "Set current variable to the variable exported then echo its value"
for entries in $(./export.bash); do
 variable=$(echo $entries|awk -F"=" '{print }');
 export $entries
 eval current_variable=$$variable
 echo "$$variable has value of $current_variable"
done


echo "round 1 - we know what was exported and we will echo out known variables"
echo $VAR
echo $VAR1

echo "Round 2 - We will just return the variable names and unset them "
for entries in $(./export.bash); do
 variable=$(echo $entries|awk -F"=" '{print }');
 unset $variable
done

echo "round 3 - Now we get nothing back"
echo $VAR
echo $VAR1

нашел интересный и аккуратный способ экспорта переменных среды из файла:

на env.vars:

foo=test

тестовый скрипт:

eval `cat env.vars`
echo $foo         # => test
sh -c 'echo $foo' # => 

export eval `cat env.vars`
echo $foo         # => test
sh -c 'echo $foo' # => test

# a better one
export `cat env.vars`
echo $foo         # => test
sh -c 'echo $foo' # => test

другой способ, что зависит от случая, это может быть полезно: создаем еще один Баш, что inherites экспортируемой переменной. Это частный случай ответа @Keith Thompson, будут все эти недостатки.

экспорт.Баш:

# !/bin/bash
export VAR="HELLO, VARIABLE"
bash

теперь:

./export.bash
echo $VAR

выполнить

set -o allexport

любые переменные, которые вы исходите из файла после этого, будут экспортированы в вашу оболочку.

source conf-file

когда вы закончите выполнять. Это отключит режим allexport.

set +o allexport

возможно, вы можете написать функцию в~/.zshrc, ~/.bashrc следующее .

# set my env
[ -s ~/.env ] && export MYENV=`cat ~/.env`
function myenv() { [[ -s ~/.env ]] && echo $argv > ~/.env && export MYENV=$argv }

Beacause переменной использования снаружи, вы можете избежать записи файла сценария.


ответа нет, но для меня я сделал следующее

сценарий: myExport

#! \bin\bash
export 

псевдоним в моем .bashrc и

alias myExport='source myExport' 

все еще вы источник его, но, возможно, таким образом, он более полезен и интересен для кого-то другого.