Это действительно зависит от того, что Вы подразумеваете под "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 часто зависит от того, кого Вы спрашиваете, и когда.
Можно сделать это с env
:
env -i your_command
Вопреки комментариям ниже, это действительно полностью убирает среду, но она не предотвращает your_command
установка новых переменных. В частности, выполнение оболочки вызовет /etc/profile
работать, и оболочка может иметь некоторых созданных в настройках также.
Можно проверить это с:
env -i env
т.е. вытрите среду и затем распечатайте ее. Вывод будет пробелом.
env -i somecommand
выполняет команду в пустой среде, как ams уже упомянул.
Много программ полагается на некоторые важные переменные среды, таким образом, можно хотеть сохранить их:
env -i HOME="$HOME" LC_CTYPE="${LC_ALL:-${LC_CTYPE:-$LANG}}" PATH="$PATH" USER="$USER" somecommand
С другой стороны, Вы могли войти в систему в маленькую разовую входом в систему среду.
ssh localhost somecommand
env
не поддерживает --
определение границ и выполнение env -i FOO=bar -- env
попытки выполнить названную команду --
.
– antak
27.07.2016, 05:16
env -i -- FOO=bar env
, на самом деле. Мое плохое. Не то, чтобы --
полезно начиная с того, что следует, это не запускается с -
.
– Gilles 'SO- stop being evil'
27.07.2016, 11:10
Хотя принятый ответ правильный, обычно вам нужно сделать следующее:
env -i bash -l -c "printenv; и любые другие команды"
Это дает вам простой, но функциональный bash (такой же как если бы вы входили в систему в неинтерактивном режиме). Это, например, устанавливает язык, часовой пояс, HOME и т. Д.
"Чистая" среда bash
может быть получена с помощью
$ env -i bash --noprofile --norc
Команда env -i
выполняет команду, данную ей в командной строке, не перенося ни одной из экспортированных переменных среды старой среды оболочки в среду выполняемой программы.
Опция --noprofile
останавливает bash
от чтения общесистемных или персональных сценариев инициализации оболочки, которые в противном случае были бы прочитаны для оболочки входа в систему.
Опция --norc
останавливает bash
от чтения персональных скриптов инициализации оболочки, которые иначе были бы прочитаны для интерактивной оболочки.
Проблема с большинством ответов здесь заключается в том, что 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
Если вы хотите убедиться, что скрипт имеет чистую среду, вы можете изменить строку shebang, как показано в этом небольшом примере:
#!/usr/bin/env -S -i bash
env
который отображает свое окружение вот так
PWD=/home/myuser/mydir
SHLVL=1
_=/usr/bin/env
Здесь мы запускаем оболочку bash
через env
, которая принимает аргумент -i
, указывающий на очистку среды. -S
требуется при передаче нескольких аргументов в строках shebang .
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:14PATH
,PWD
иSHLVL
установлены автоматически Bash. +1. – l0b0 24.09.2012, 17:31