Как указывали другие, причина, по которой это не работает, заключается в том, что переменные среды живут в пространствах памяти для каждого процесса и поэтому умирают, когда процесс Python завершается.
Они указывают, что решением этой проблемы является определение псевдонима в .bashrc
, чтобы делать то, что вы хотите, например:
alias export_my_program="export MY_VAR=`my_program`"
Однако есть еще один (немного хитрый) метод, который не требует от вас изменения .bachrc
и наличия my_program
в $PATH
(или указания полного пути к нему в псевдониме). Идея состоит в том, чтобы запустить программу на Python, если она вызывается нормально (./my_program
), и на Bash, если она получена (source my_program
). (Использование source
в сценарии не порождает новый процесс и, следовательно, не уничтожает переменные среды, созданные внутри.) Вы можете сделать это следующим образом:
my_program.py
:
#!/usr/bin/env python3
_UNUSED_VAR=0
_UNUSED_VAR=0 \
<< _UNUSED_VAR
#=======================
# Bash code starts here
#=======================
'''
_UNUSED_VAR
export MY_VAR=`$(dirname $0)/my_program.py`
echo $MY_VAR
return
'''
#=========================
# Python code starts here
#=========================
print('Hello environment!')
Запустив это в Python (./my_program.py
), первые 3 строки не сделают ничего полезного, а тройные кавычки закомментируют код Bash, позволяя Python нормально работать без каких-либо синтаксических ошибок из Bash.
Получив это в bash (source my_program.py
), heredoc (<< _UNUSED_VAR
) - это уловка, используемая для «комментирования» первой тройной кавычки, что в противном случае было бы синтаксической ошибкой. Сценарий возвращается, не дойдя до второй тройной кавычки, что позволяет избежать еще одной синтаксической ошибки. export
присваивает результат выполнения my_program.py
в Python из правильного каталога (заданного $(dirname $0)
) переменной среды MY_VAR
. echo $MY_VAR
выводит результат в командную строку.
Пример использования:
$ source my_program.py
Hello environment!
$ echo $MY_VAR
Hello environment!
Однако сценарий по-прежнему будет делать все, что делал до этого, за исключением экспорта переменной среды, если выполняется нормально:
$ ./my_program.py
Hello environment!
$ echo $MY_VAR
<-- Empty line
person
nijoakim
schedule
10.05.2020
pwd
' Идеальное решение. - person physicsmichael   schedule 04.04.2009