Можно ли экспортировать переменную в среду из bash script без ее источника?

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

export.bash:

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

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

echo $VAR

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

Ответ 1

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

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

Но есть несколько возможных обходных путей.

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

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

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

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

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

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

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

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

export FOO=BAR
exec "[email protected]"
$ ./set-vars3.sh printenv | grep FOO
FOO=BAR

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

Ответ 2

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

. ./export.bash

или

source ./export.bash

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

 echo $VAR
HELLO, VARABLE

Теперь мы будем reset VAR

export VAR=""
echo $VAR

Теперь мы выполним script, чтобы исправить эту переменную, а затем отключить ее:

./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

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

ПОЖАЛУЙСТА, ОБРАТИТЕ ВНИМАНИЕ: экспорт ограничен script, который выполняет экспорт в вашей основной консоли, - так что до задания cron я бы добавил его как консоль, как показано ниже... для части команды все еще сомнительно: вот как вы запустили бы из своей оболочки:

В командной строке (пока у параметра export.bash есть несколько значений эха)

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

cat 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; 

    "[email protected]"; 

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

}

отправьте свой файл bashrc, и вы можете сделать что-либо выше в любое время...

В любом случае, обратно к остальному.

Это сделало его доступным по всему миру, затем выполнило script..

просто повторите его, а затем запустите экспорт в echo!

cat export.bash

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

Теперь в script или в вашей консоли выполните:

 export "$(./export.bash)"

Try:

echo $VAR
HELLO THERE

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

cat export.bash

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

cat 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 $1}');
     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

script: cat 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 $1}');
 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 $1}');
 unset $variable
done

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

Ответ 3

Нашел интересный и опрятный способ экспортировать переменные среды из файла:

в env.vars:

foo=test

test script:

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

Ответ 4

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

script: myExport

#! \bin\bash
export $1

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

alias myExport='source myExport' 

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

Ответ 5

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

export.bash:

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

Сейчас:

./export.bash
echo $VAR

Ответ 6

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

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

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