Подтвердить что ты не робот

Какая разница между "env" и "set" (на Mac OS X или Linux)?

Я получаю аналогичные результаты, запускающие "env" и "set". Set дает больше результатов - это надмножество env?

Страница man для набора не дает никакой информации. Как эти команды работают и какая разница?

4b9b3361

Ответ 1

Короче говоря: set может видеть локальные переменные оболочки, env не может.

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

Так как set является встроенной командой оболочки, она также видит локальные переменные shell (включая функции оболочки). env, с другой стороны, является независимым исполняемым файлом; он видит только переменные, передаваемые оболочкой, или переменные среды.

При вводе строки типа a=1 создается локальная переменная (если она уже не существовала в среде). Переменные окружения создаются с помощью export a=1

Ответ 2

Если вы хотите ограничить вывод команды set только переменными, вы можете запустить ее в режиме POSIX:

type -a env set
help set
(set -o posix; set) | nl

Если вам нужен более тонкий контроль над перечислением определенных переменных, вы можете использовать Bash встроенные функции, такие как declare или compgen, или некоторые другие трюки Bash.

man bash | less -p '-A action$'  # info on complete & compgen

# listing names of variables
compgen -A variable | nl       # list names of all shell variables
echo ${!P*}                    # list names of all variables beginning with P

compgen -A export | nl         # list names of exported shell variables
export | nl                    # same, plus always OLDPWD
declare -px | nl               # same

declare -pr                    # list readonly variables

# listing names of functions           
compgen -A function | nl
declare -F | nl
declare -Fx | nl

# show code of specified function
myfunc() { echo 'Hello, world!'; return 0; }
declare -f myfunc  

Ответ 3

set - это встроенная оболочка, а env - это программа (/usr/bin/env)

set выполняет несколько действий, но сам он перечисляет переменные среды. Он также может устанавливать/тумблеры, такие как set +x или set -v и т.д.

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

Подробнее см. man 1 env.