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