LINUX.ORG.RU
ФорумAdmin

Вопрос по командам set, env, declare, export


1

0

Не могу понять, чем объясняется разница в выводе команд set, env, export и declare (typeset). Вроде все они должны выводить перечень переменных среды (и функций), но вывод этих команд существенно отличается. Может кто-нибудь толково объяснить, в чем их разница. В man-ах копался, но не понял.

★★★

Дак а чего?  set без аргументов показывает переменные текущей
оболочки и их значения, env -- переменные окружения, т.е. такие,
которые будут переданы всем дочерним шеллам:

$ var_local=AAAA
$ export var_global=BBBB
$ echo $var_local
AAAA
$ echo $var_global
BBBB
$ set | grep ^var_global
var_global=BBBB
$ set | grep ^var_local
var_local=AAAA
$ env | grep ^var_global
var_global=BBBB
$ set | grep ^var_local
var_local=AAAA
$ sh
$ echo $var_local

$ echo $var_global
BBBB
$ set | grep ^var_global
var_global=BBBB
$ set | grep ^var_local
$ env | grep ^var_global
var_global=BBBB
$ env | grep ^var_local
$

anonymous
()
Ответ на: комментарий от anonymous

То, что существуют переменные среды локальные и глобальные (точнее, наследуемые) я и сам знаю. А вот в чем разница в выводе 4 команд, каждая из которых по man-у должна выводить состав окружения, понять не могу. Вот небольшая табличка показывающая объем файла и число строк в нем для 4 команд, каждая из которых должна вроде как выдавать состав текущего окружения (все запускались в одном и том же консольном окне, то есть в одинаковых условиях):

declare 3803 байта 77 строк set 3776 байта 77 строк export 3558 байта 67 строк env 2861 байта 45 строк

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

vikos ★★★
() автор топика
Ответ на: комментарий от vikos

> То, что существуют переменные среды локальные и глобальные (точнее,
наследуемые) я и сам знаю. А вот в чем разница в выводе 4 команд,
каждая из которых по man-у должна выводить состав окружения, понять
не могу.

Ты понимаешь разницу между переменными окружения и переменными
текущего шелла? "Состав окружения" -- это вообще что такое?  Почему
он должен быть одинаковым для всех команд если есть разница между
наследуемыми и ненаследуемыми переменными? Перечитай первый ответ еще
раз (до этого может потребоваться включить мозг)

Для переменных окружения:
$ set | wc -l
74
$ declare | wc -l
74
Для переменных текущего шелла:
$ export | wc -l
45
$ env | wc -l
45

anonymous
()
Ответ на: комментарий от anonymous

Тогда поясни разницу между переменными окружения и переменными текущего шелла. И скажи, какая из команд выдает переменные текущего шелла и какая переменные окружения. Я все 4 команды запускал в одном и том же шелле.

vikos ★★★
() автор топика
Ответ на: комментарий от vikos

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

Параметры (от англ. parameters) -- это именованные области памяти, способные хранить некую информацию (значение, value) различного типа (целые, строки, етц). В контексте баша переменными (variables) называют параметры, которые могут быть определены по имени. [Дальнейшее чтение -- man bash, /^PARAMETERS]

Каждой программе при запуске передается строковый массив, который называется "окружением" (environment). Он представляет собой список переменных и их значений. Таким образом, переменными окружения можно назвать те переменные, которые передаются всем потомкам процесса. Список таких переменных можно посмотреть, вызвав команды env и export. [Дальнейшее чтение -- man bash, /^ENVIRONMENT]

Список переменных окружения И переменных-только-данного-шелла можно получить, вызвав команды set и declare.

anonymous
()
Ответ на: комментарий от anonymous

Благодарю вас за высокий отзыв о моих умственных способностях, а также за то, что тратите время на такого тупицу как я. Тем не менее смею заметить, что на поставленный вопрос вы пока не ответили. Ибо вопрос состоял не в том, чтобы дать определение переменной и окружению (кой как читать и по русски и по английски я уже научился), а в том, почему отличается вывод 4 команд: set, declare, export и env, если все они, будучи запущенными без параметров, должны давать вроде как одно и то же окружение. А результат разный. Напрягите, пожалуйста, свой мозг еще раз. И обратите внимание - я не употребляю ненормативную лексику. В.Костромин

vikos ★★★
() автор топика
Ответ на: комментарий от vikos

> на поставленный вопрос вы пока не ответили.

Вы спрашивали

1) "поясни разницу между переменными окружения и переменными текущего шелла". Я дал определения как первым, так и вторым. Вы не уяснили разницу из этих определений?

2) "скажи, какая из команд выдает переменные текущего шелла и какая переменные окружения". После каждого определения я написал какую команду использовать для вывода списка тех или иных переменных. Что было непонятно?

-> на поставленный вопрос я ответил

> почему отличается вывод 4 команд: set, declare, export и env, если все они, будучи запущенными без параметров, должны давать вроде как одно и то же окружение.

Они не "должны давать одно и то же окружение". export и env должны давать переменные окружения, а set и declare -- как переменные окружения, так и переменные только текущего шелла (в том числе функции). !!!Не все переменные являются переменными окружения.!!! Т.о., команды export и env эквивалентны, за тем исключением, что export выводит список пар переменная="значение" с предшествующей им конструкцией 'declare -x' (в чем вы можете сами убедиться), а env -- просто переменная=значение. Также вывод set и declare эквивалентен, за исключением нескольких специфичных для конкретного шелла переменных вроде $_ или $WINDOWID. Еще у меня export почему-то показывает $OLDPWD без значения.

По крайней мере, так получается на моей машине (LFS-6.2, Linux blacksun 2.6.19.2_stable #7 PREEMPT Wed Aug 22 12:06:54 MSD 2007 i686 athlon-4 i386 GNU/Linux) и так должно получаться по манам.

> Напрягите, пожалуйста, свой мозг еще раз. И обратите внимание - я не употребляю ненормативную лексику.

Давайте без хуйни.

> В.Костромин

Анонимус

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.