Установка переменных среды для контекста терминальной сессии в python или bash (или обоих!) - PullRequest
0 голосов
/ 23 сентября 2018

Я хотел бы установить переменные среды для области сеанса терминала.

Например, пользователь откроет терминал, наберет что-то вроде setproject <project_name> и экспортирует переменную среды PROJECT.Когда они закрывают терминал, настройка переменной теряется.Что было впечатляющим в этой системе, так это то, что она знала, какое имя проекта было правильным, а какое - нет.Я работал в местах, которые сделали это довольно хорошо, и мне интересно, как это делается.

Я бы предпочел, чтобы пользователь не вводил source setproject <project_name>, и я также хотел проверить, если проект ониуказано допустимо или нет.

Я написал что-то на python, который проверяет правильность имени проекта (по сравнению с файлом конфигурации yaml) и передает его скрипту bash, но это не такдействительно работает (переменная окружения не установлена ​​должным образом. Она установлена, но только для области действия скрипта python)

Итак, как я могу это сделать?Есть ли хорошие примеры того, что я ищу в Интернете?

1 Ответ

0 голосов
/ 23 сентября 2018

Вы не можете сделать это с помощью обычной команды - обычные команды (сценарии оболочки, сценарии Python, двоичные файлы и т. Д.) Выполняются как подпроцесс в основном процессе оболочки и не могут влиять на среду основного процесса оболочки.Но оболочка поддерживает несколько командных вещей, которые «происходят» в самой оболочке: функции и псевдонимы.Оба они должны быть определены в оболочке, прежде чем их можно будет использовать, поэтому вам нужно будет поместить определение в .bash_profile (или в любой другой файл инициализации оболочки, который есть в вашей настройке - см. здесь ).

Я бы сделал так, чтобы определить setproject как функцию оболочки, примерно так:

# ...in shell init file...
setproject() {
    if [ some_test_for_project_validity ]; then
        export PROJECT="$1"
    else
        echo "setproject: $1 is not a valid project name" >&2
        return 1
    fi
}

Логика, которая вам здесь нужна, слишком сложна, чтобы ее можно было использовать.псевдоним (они гораздо проще и тупее, чем функции), но вы можете поместить настоящий скрипт в отдельный файл и использовать псевдоним, чтобы избежать необходимости явно source it:

# ...in shell init file...
alias setproject='source /path/to/setproject'

# .../path/to/setproject...
# note no shebang, since it won't be run as a normal command
if [ some_test_for_project_validity ]; then
    export PROJECT="$1"
else
    echo "setproject: $1 is not a valid project name" >&2
    return 1    # In a file to be source'd, use return instead of exit
fi
...