Отменить установку переменной среды для одной команды

  1. Создать необходимую среду Anaconda conda create --name environmentName python = 3 pandas numpy .

    Включите сразу все ваши зависимости при создании среды.

  2. Запустите среду , источник активируйте environmentName .
  3. Выполнение сценария python python fileName.py . Вам не нужно указывать версию python, потому что сценарий выполняется в среде Anaconda. Используемая версия будет той, что указана в среде (для скрипта требуется python3, который уже был указан в среде Anaconda).
25
28.08.2017, 17:22
3 ответа

Кроме опции -i, которая стирает всю среду, POSIX envне предоставляет никакого способа сбросить значение переменной.

Тем не менее, с несколькими реализациями env(включая, по крайней мере, GNU, busybox' и FreeBSD), вы можете сделать:

env -u ENV_VAR command

Что будет работать при удалении каждого экземпляра Переменная ENV_VARиз среды (обратите внимание, что она не работает для переменной среды с пустым именем ( env -u ''либо выдает ошибку, либо неэффективна в зависимости от реализация, хотя все принимают env '=value', вероятно, ограничение, вызванное функцией unsetenv()C, которая требует POSIX для возврата ошибки для пустой строки, хотя такого нет. ограничение для putenv())).

Переносимо (в оболочках POSIX) вы можете сделать:

(unset -v ENV_VAR; exec command)

(обратите внимание, что в некоторых оболочках использование execможет изменить выполняемую команду: запускает команду в filesystem вместо функции или встроенной функции, например (и, очевидно, обойдёт расширение alias), например envвыше. В таких случаях вы захотите опустить его).

Но это не будет работать для переменных среды, имя которых не может быть сопоставлено с переменной оболочки (обратите внимание, что некоторые оболочки, такие как mksh, в любом случае удалят эти переменные из среды при запуске) или переменные, помеченные как доступные только для чтения.

-vдля оболочки Bourne и bash, чей unsetбез -vможет сбросить функцию ENV_VAR , если не было переменнойс таким именем. Большинство других оболочек не отключат функции, если вы не передадите параметр -f.(на практике маловероятно).

(Также остерегайтесь ошибки/неправильной функции bash/ mksh/ yash, чей unset, при некоторых обстоятельствах может не сбрасываться переменная, но раскрывает переменную во внешней области видимости )

Если доступен perl, вы можете сделать:

perl -e 'delete $ENV{shift@ARGV}; exec @ARGV or die$!' ENV_VAR command

Что будет работать даже для переменной среды с пустым название.

Теперь все это не будет работать, если вы хотите изменить переменную окружения для встроенной функции или функции и не хотите, чтобы они запускались в подоболочке, как в bash:

env -u LANG printf -v var %.3f 1.2 # would run /usr/bin/printf instead
(unset -v LANG; printf -v var %.3f 1.2) # changes to $var lost afterwards

(здесь сбрасывать LANG как ошибочный подход, чтобы убедиться, что . используется и понимается как десятичный разделитель. Для этого было бы лучше использовать LC_ALL=C printf... )

В некоторых оболочках вы можете вместо этого создать локальную область для переменной с помощью функции:

without() {
  local "$1" # $1 variable declared as initially unset in bash¹
  shift
  "$@"
}
without LANG printf -v var %.3f 1.2

С zshвы также можете использовать анонимную функцию:

(){local ENV_VAR; command}

Этот подход не будет работать в некоторых оболочках. (например, основанные на оболочке Almquist), чьи локальныене объявляют переменную как изначально не установленную (но наследуют значение и атрибуты). В них вы можете сделать local ENV_VAR; unset ENV_VAR, но не делайте этого в mkshили yash(typesetвместо localдля этого), как это не сработает, unsetбудет только отменять local.

¹ Также имейте в виду, что в bashлокальный ENV_VAR(даже если он не установлен) сохранит атрибут export. Таким образом, если бы commandбыла функцией, которая присваивает значение ENV_VAR, переменная была бы доступна в среде команд, вызываемых впоследствии. unset ENV_VARочистит этот атрибут. Или вы можете использовать local +x ENV_VAR, что также обеспечит чистый лист (если эта переменная не была объявлена ​​доступной только для чтения, но тогда вы ничего не можете с этим поделать в bash).

40
27.01.2020, 19:40

Насколько мне известно, прямого эквивалента нет; вы можете использовать подоболочку:

(unset ENV_VAR; exec command)
11
27.01.2020, 19:40

Вы можете использоватьENV_VAR= command

На самом деле это не отменяет установку переменной, но может быть полезно во многих случаях. (Сценарии оболочки обычно просто используют test -nдля проверки того, установлена ​​ли переменная):

$ export ENV_VAR=foo
$ mycommand
ENV_VAR: foo
$ ENV_VAR=bar mycommand
ENV_VAR: bar
$ ENV_VAR= mycommand
ENV_VAR: 
0
27.01.2020, 19:40

Теги

Похожие вопросы