Я получаю аналогичные результаты, запускающие "env" и "set". Set дает больше результатов - это надмножество env?
Страница man для набора не дает никакой информации. Как эти команды работают и какая разница?
Я получаю аналогичные результаты, запускающие "env" и "set". Set дает больше результатов - это надмножество env?
Страница man для набора не дает никакой информации. Как эти команды работают и какая разница?
Короче говоря: set
может видеть локальные переменные оболочки, env
не может.
В оболочках могут быть переменные двух типов: локальные, доступные только из текущей оболочки, и (экспортируемые) переменные среды, которые передаются каждой исполняемой программе.
Так как set
является встроенной командой оболочки, она также видит локальные переменные shell (включая функции оболочки). env
, с другой стороны, является независимым исполняемым файлом; он видит только переменные, передаваемые оболочкой, или переменные среды.
При вводе строки типа a=1
создается локальная переменная (если она уже не существовала в среде). Переменные окружения создаются с помощью export a=1
Если вы хотите ограничить вывод команды 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
set
- это встроенная оболочка, а env
- это программа (/usr/bin/env)
set
выполняет несколько действий, но сам он перечисляет переменные среды. Он также может устанавливать/тумблеры, такие как set +x
или set -v
и т.д.
env
сам перечисляет экспортированные переменные среды, но может запускать программу в измененной среде
Подробнее см. man 1 env
.