LINUX.ORG.RU

Переменные окружения!


0

1

Всем доброго времени суток! Как я понял, переменные делятся как бы на локальные(переменные оболочки) и глобальные(переменные окружения). Локальные переменные - это те переменные, которые не экспортированы во внешнее окружение и не используются внешними программами. Тогда получается, что локальные переменные(переменные оболочки) используются только в shell скриптах?


Ответ на: комментарий от kane1

Ну, у меня, как у майнера, например, под рукой такой пример:

export GPU_USE_SYNC_OBJECTS=1 ; export GPU_MAX_ALLOC_PERCENT=100 ; /home/rain/bfgminer-3.2.0/bfgminer --config=/mnt/rw/rain/.bfgminer/bfgminer.conf --scrypt

И bfgminer тут - не shell-скрипт.

YAR ★★★★★ ()

Немного не так. Локальные переменные принадлежат только тому экземпляру шелла, который их создал. Их не видно из родительских и дочерних экземпляров. Используеются не только в скриптах, но и напрямую в консоли, например:

andrew@andrew ~ $ a=/dev/sd*
andrew@andrew ~ $ ls $a
/dev/sda  /dev/sda1  /dev/sda2  /dev/sda3  /dev/sda4  /dev/sda5  /dev/sdb
При этом, если в консоли присвоить значение переменной и запустить скрипт - из скрипта переменная будет не видна.

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

Как я понял не видна она будет, потому что под скрипт создаётся отдельный процесс, который является дочерним процесса оболочки. И этот процесс наследует только те переменные, который были экспортированы.

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

export переменную делает глобальной и её могут наследовать дочерние процессы оболочки, т.е. те программы которые были выполнены в оболочке. А вот интересно, где локальные можно использовать?

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

Собственно, и без экспорта будет, если присваивать переменную при запуске дочернего скрипта:


rain@elitebook:/tmp$ echo $a

rain@elitebook:/tmp$ cat file.sh 
#!/bin/bash

echo $a
rain@elitebook:/tmp$ a=a ./file.sh 
a

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

Странно тоже самое проделал и не выводи значение переменной $a. Да и по идеи не должно выводит. Вы создали локальную переменную без экспорта. А когда запускается скрипт file.sh создаётся отдельный процесс, который является дочерним процессом оболочки. И этот дочерний процесс может унаследовать только экспортированные переменные. Т.е. по сути скрипт показывает переменные окружения процесса, в котором он работает, а не переменные оболочки. Потому что процессы изолированы и если один процесс попытается залезть в адресное пространство другого процесса, то система его убьёт. Скорее всего переменная $a уже была экспортирована.

kane1 ()
Ответ на: комментарий от kane1
rain@elitebook:/tmp$ echo $a

rain@elitebook:/tmp$ unset a
rain@elitebook:/tmp$ ./file.sh 

rain@elitebook:/tmp$ a=a
rain@elitebook:/tmp$ echo $a
a
rain@elitebook:/tmp$ ./file.sh 

rain@elitebook:/tmp$ a=a ./file.sh 
a

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

показывает значение только, если выполнить: $ a=a ./file.sh А если выполнить, вот так: $ ./file.sh То не показывает значение переменной $a.

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