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