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



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



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



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


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



echo $VAR


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

910   7  

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

код: кот 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

}

источник вашего файла 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

еще один обходной путь, который, в зависимости от случая, может быть полезен: создание другого bash, который наследует экспортируемую переменную. Это частный случай ответа @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 }

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

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

сценарий: мой экспорт

#! \bin\bash
export 

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

alias myExport='source myExport' 

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

Comments

    Ничего не найдено.