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

Я могу запустить ENV_VAR=value command для запуска command с определенным значением для ENV_VAR . Что эквивалентно отключению ENV_VAR для command ?

  • Введение env --null
  • bash: export: `PATH: home / pi / netkit / bin: / usr / local ... invalid indentifier
  • Экспортирование переменной с точкой (.) В ней
  • Использование Crontab -e с нестандартным редактором с ограниченной оболочкой (не экспортировать переменную или запустить редактор)
  • Как запустить мою программу C из любой точки системы (Ubuntu 10.10)?
  • Настройка переменных окружения в Ubuntu
  • Установка IFS для сценария bash
  • что используется команда «экспорт»
  • 3 Solutions collect form web for “Отменить переменную среды для одной команды”

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

     env -u ENV_VAR command 

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

    Можно переносить (в оболочках POSIX):

     (unset -v ENV_VAR; exec command) 

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

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

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

    (Также будьте осторожны с ошибкой / ошибкой bash / mksh / mksh , которая не 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 не объявляют переменную как первоначально не заданную (но наследуют значение и атрибуты). В них вы можете сделать local ENV_VAR; unset ENV_VAR local ENV_VAR; unset ENV_VAR , но не делайте этого в mksh или mksh (вместо этого вместо local для этого), поскольку это не сработает, unset будет только отменять local .

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

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

     (unset ENV_VAR; exec command) 

    Вы можете использовать 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: 
    Interesting Posts

    как исправить ключевой лаг на ноутбуке при запуске в режиме батареи?

    Выбор программного обеспечения для виртуальных машин в Linux

    Добавить один ключ к сертификатам CA из автоматизированного сценария

    Обнаружение изображений, содержащих только черные пиксели

    Создание iso-образа стойкого live-usb с несколькими разделами

    Список всех ключей GPG / PGP локального ключевого сервера SKS

    grub: система загрузки на диске без GPT в режиме UEFI

    MDADM: automount работает только с dev, а не с UUID

    Всегда ли монтируется root?

    У вас установлена ​​безопасность / openssl, но DEFAULT_VERSIONS + = ssl = openssl не установлен в вашем make.conf

    zsh: Повторять каждое утверждение?

    Недостаточно памяти с неиспользуемой памятью и свопом

    Настройка интерфейса wlan0 во время загрузки

    Выполнение параллельных заданий bash в кластере HPC с использованием GNU parallel

    Совместное использование контента / приложений между консолью и консолью VNC

    Linux и Unix - лучшая ОС в мире.