Как запустить программу в чистой среде в ударе?

Это действительно зависит от того, что Вы подразумеваете под "Unix". Unix прибыл для значения различных вещей в современные времена (и даже в точке создания Linux, это означало несколько вещей).

В целом Unix не является конкретной системой, а спецификацией для систем, называя себя "подобными Unix". Когда люди говорят "Unix", они не обязательно означают, что "собственная операционная система, принадлежавшая AT&T/Novell/Cisco/whoever теперь, владеет им при чтении этого", скорее они обычно обращаются к целому спектру подобных Unix Ose, как AIX, HP-UX, Linux, BSD, Солярис, и т.д. До этого градуса Linux является FOSS, подобным Unix ядром. Это не прямое ветвление исходной кодовой базы Unix, но это совместно использует много общих черт.

Другой причиной, что многие люди расценивают Linux для Unix, является то, что это главным образом совместимо POSIX (который очень важен для совместимости с другими подобными Unix системами). Некоторые также связывают Linux с Unix из-за первоначальной истории проекта - Linux был в основном вдохновлен (но не было ветвление), MINIX, который является и был, широко расценен, чтобы быть попыткой создать клон Unix FOSS. Много дистрибутивов Linux также часто реализуют много инструментов (или клоны/приближения инструментов) от Unix, часто в форме GNU Coreutils. В наше время эти инструменты были изменены много (некоторые приведут доводы в пользу худшего, GNU, Coreutils известен за излишнее усложнение), но обычно все еще поддержите мобильность с их исходными дубликатами.

Linux является также бесспорно бесплатным, программным обеспечением с открытым исходным кодом под GPL, тогда как лицензирование исходной кодовой базы Unix часто зависит от того, кого Вы спрашиваете, и когда.

118
24.09.2012, 16:26
7 ответов

Можно сделать это с env:

env -i your_command

Вопреки комментариям ниже, это действительно полностью убирает среду, но она не предотвращает your_command установка новых переменных. В частности, выполнение оболочки вызовет /etc/profile работать, и оболочка может иметь некоторых созданных в настройках также.

Можно проверить это с:

env -i env

т.е. вытрите среду и затем распечатайте ее. Вывод будет пробелом.

134
27.01.2020, 19:29
  • 1
    Это не полностью убирает среду: echo 'echo $PATH' > test.sh && chmod u+x test.sh && env -i test.sh печать /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin. –  l0b0 24.09.2012, 17:14
  • 2
    Однако кажется, что это является самым близким, можно добраться - Это походит на переменные как PATH, PWD и SHLVL установлены автоматически Bash. +1. –  l0b0 24.09.2012, 17:31
  • 3
    @I0b0: Посмотрите мое редактирование. –  ams 24.09.2012, 17:37

env -i somecommand выполняет команду в пустой среде, как ams уже упомянул.

Много программ полагается на некоторые важные переменные среды, таким образом, можно хотеть сохранить их:

env -i HOME="$HOME" LC_CTYPE="${LC_ALL:-${LC_CTYPE:-$LANG}}" PATH="$PATH" USER="$USER" somecommand

С другой стороны, Вы могли войти в систему в маленькую разовую входом в систему среду.

ssh localhost somecommand
28
27.01.2020, 19:29
  • 1
    Работы при выполнении команды на cmdline. Как я помещаю это в хижину?, кажется, не работает! –  balki 04.11.2013, 19:16
  • 2
    Странный, мой env не поддерживает -- определение границ и выполнение env -i FOO=bar -- env попытки выполнить названную команду --. –  antak 27.07.2016, 05:16
  • 3
    @antak, Который должен быть env -i -- FOO=bar env, на самом деле. Мое плохое. Не то, чтобы -- полезно начиная с того, что следует, это не запускается с -. –  Gilles 'SO- stop being evil' 27.07.2016, 11:10
  • 4
    не понял, что Вы всегда могли ssh в localhost, это довольно странно. Что проку случай там. –  Edgar Aroutiounian 12.03.2017, 18:04
  • 5
    @EdgarAroutiounian, Вы можете SSH к localhost, если он выполняет сервер SSH. Почему программисты прошли бы усилие по запрещению его? спасибо –  Gilles 'SO- stop being evil' 12.03.2017, 22:26
[1129131]Ответить на комментарий Балки (и ответить на свой вопрос в процессе :-):[12234]
0
27.01.2020, 19:29

Хотя принятый ответ правильный, обычно вам нужно сделать следующее:

env -i bash -l -c "printenv; и любые другие команды"

Это дает вам простой, но функциональный bash (такой же как если бы вы входили в систему в неинтерактивном режиме). Это, например, устанавливает язык, часовой пояс, HOME и т. Д.

4
27.01.2020, 19:29

"Чистая" среда bash может быть получена с помощью

$ env -i bash --noprofile --norc
  • Команда env -i выполняет команду, данную ей в командной строке, не перенося ни одной из экспортированных переменных среды старой среды оболочки в среду выполняемой программы.

  • Опция --noprofile останавливает bash от чтения общесистемных или персональных сценариев инициализации оболочки, которые в противном случае были бы прочитаны для оболочки входа в систему.

  • Опция --norc останавливает bash от чтения персональных скриптов инициализации оболочки, которые иначе были бы прочитаны для интерактивной оболочки.

37
27.01.2020, 19:29

Проблема с большинством ответов здесь заключается в том, что env -iочищает HOME, поэтому даже если вы запустите bash -lвнутри, он не будет читать ваш .bash_profileи т. д. Если то, что вы ищете, оболочка, которая действует так, как будто вы только что выполнили новый вход в систему, вместо этого вам понадобится это:

env -i HOME="$HOME" bash -l -c 'your_command'

Пример:

$ export ABC=123
$ env -i HOME="$HOME" bash -l -c 'env' | grep ABC
$ env HOME="$HOME" bash -l -c 'env' | grep ABC
ABC=123
4
27.01.2020, 19:29

Если вы хотите убедиться, что скрипт имеет чистую среду, вы можете изменить строку shebang, как показано в этом небольшом примере:

#!/usr/bin/env -S -i bash
env

который отображает свое окружение вот так

PWD=/home/myuser/mydir
SHLVL=1
_=/usr/bin/env

Здесь мы запускаем оболочку bashчерез env, которая принимает аргумент -i, указывающий на очистку среды. -Sтребуется при передаче нескольких аргументов в строках shebang .

-1
20.02.2020, 11:57

Теги

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