Могу ли я экспортировать переменную в среду из сценария 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 -- .код: кот 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