Переменная окружения vs переменная Shell, в чем разница?

Я использую следующее, которое не связано с добавлением новых команд:

cd() {
  builtin cd "$@"
  local status=$?
  [ $status -eq 0 ] && ls
  return $status
}

Это делает работу cd той же, что и раньше, за исключением того, что есть ls.

Обратите внимание на следующие последствия. Другие примеры не позволяют аргументы cd. Хотя, по общему признанию, эти аргументы являются необычными, это замена на 100% совместимость. И поскольку он возвращает статус выхода cd, он не будет нарушать скрипты.

Здесь есть одна оговорка. Если вам когда-либо не нужна эта функциональность, вы должны вызвать builtin cd. Но мой опыт использования этой функции на протяжении многих лет заключается в том, что такие события встречаются редко, что происходит главным образом в сценариях, и удобство отсутствия необходимости вводить что-то долгое, как mycd каждый раз, когда вы хотите сменить каталоги, значительно перевешивает незначительный недостаток набора текста builtin cd один раз в синей луне.

45
задан 14 February 2011 в 17:08

55 ответов

Чтобы ответить на этот вопрос, сначала попробуйте понять область действия переменной.

Когда вы создаете новую переменную типа SOME_ENV_VARIABLE="testing.txt", она находится в SHELL scope, это означает, что к ней можно получить доступ к этому экземпляру оболочки, в которой пользователь вошел в систему. Когда экземпляр меняет, например, вы открываете новый терминал или вы меняете оболочку (например, вы переключаетесь на csh), вы не можете получить доступ к этой переменной.

Когда вы экспортируете такую ​​переменную, как export SOME_ENV_VARIABLE, эта переменная теперь доступна в области среды, что означает , что экземпляр оболочки , если вы меняете оболочку, вы все равно можете получить доступ к этой переменной. Давайте попробуем разобраться со следующим примером:

[vishrant@localhost]$ SOME_ENV_VARIABLE="testing.txt" #creating variable in bash shell [vishrant@localhost]$ echo $SOME_ENV_VARIABLE testing.txt [vishrant@localhost]$ export SOME_ENV_VARIABLE #variable now available with environment [vishrant@localhost]$ env | grep SOME_ENV_VARIABLE SOME_ENV_VARIABLE=testing.txt [vishrant@localhost]$ csh #changing shell [vishrant@localhost ~/shell_scripting]$ echo $SOME_ENV_VARIABLE testing.txt [vishrant@localhost ~/shell_scripting]$ exit exit #returned to parent shell [vishrant@localhost]$ SOME_SHELL_VARIABLE="hello.txt" [vishrant@localhost]$ csh [vishrant@localhost ~/shell_scripting]$ echo $SOME_SHELL_VARIABLE SOME_SHELL_VARIABLE: Undefined variable.

Аналогия: предположим, у вас есть квартира с двумя спальнями, и вы делитесь ею с другим соседом по комнате. С общей зоной можно связаться кто угодно, но не ваши спальни, переменная окружения подобна общей области, а переменная оболочки похожа на спальню, если вы будете что-то в общей области, к которой может обратиться любой, но если вы храните ее в своей спальне, она может

Помните, если открыть новый терминал, вы не сможете получить доступ к какой-либо из переменных, потому что вы меняете Analogy: . Для этого вы должны добавить свои переменные в .profile или .bashrc (если вы используете bash).

0
ответ дан 31 July 2018 в 11:30

Есть разница. Переменные оболочки и переменные среды объясняют это лучше, чем я могу, но вот отрывок из нее:

Если в переменную оболочки было внесено изменение, она должна быть явно «экспортирована» в соответствующую переменную среды для того, чтобы любые разветвленные подпроцессы увидели изменение. Напомним, что переменные оболочки являются локальными для оболочки, в которой они были определены.
7
ответ дан 2 August 2018 в 03:55
  • 1
    Я комментирую свой собственный ответ. Мне очень нравится ссылка Help Ubuntu в ответе Таккат ... (это лучше, чем мое) – Peter.O 14 February 2011 в 18:46
  • 2
    Плюс ваша ссылка больше не работает! – user 19 September 2017 в 18:19

Shell Variable: Short Term, применяется только к текущему экземпляру оболочки, не применимо к системе

Экологическая переменная: долгосрочное использование, допустимая системная ширина, разрешено во всем мире

By условные переменные Shell Variable имеют свое имя в нижнем регистре, а Envn. Переменные записываются как прописные буквы

2
ответ дан 2 August 2018 в 03:55

Переменная окружения является глобально доступной, в программе и дочерних программах. Переменная оболочки доступна только в текущей оболочке. Чтобы сделать переменную оболочки доступной как переменную среды, используйте export VARNAME (без доллара $).

Примеры для пояснения:

$ SOME=VAR # define shell variable $SOME $ echo $SOME VAR $ env | grep SOME # note: no output $ export SOME # turn $SOME into an environment variable $ env | grep SOME SOME=VAR

Другой способ определения среды переменная:

$ export ANOTHER=VALUE $ echo $ANOTHER VALUE $ env | grep ANOTHER ANOTHER=VALUE
34
ответ дан 2 August 2018 в 03:55
  • 1
    Я не думаю, что это правильно. export не обязательно устанавливает переменную среды. [D0] stackoverflow.com/questions/7411455/&hellip – Chris Stryczynski 17 November 2017 в 21:41
  • 2
    @ChrisStryczynski export устанавливает переменную среды для дочерних процессов. Сообщение, которое вы связываете, не противоречит этому ответу, не могли бы вы объяснить, почему вы считаете, что это неправильно? – Lekensteyn 20 November 2017 в 03:12

Чтобы ответить на этот вопрос, сначала попробуйте понять область действия переменной.

Когда вы создаете новую переменную типа SOME_ENV_VARIABLE="testing.txt", она находится в SHELL scope, это означает, что к ней можно получить доступ к этому экземпляру оболочки, в которой пользователь вошел в систему. Когда экземпляр меняет, например, вы открываете новый терминал или вы меняете оболочку (например, вы переключаетесь на csh), вы не можете получить доступ к этой переменной.

Когда вы экспортируете такую ​​переменную, как export SOME_ENV_VARIABLE, эта переменная теперь доступна в области среды, что означает , что экземпляр оболочки , если вы меняете оболочку, вы все равно можете получить доступ к этой переменной. Давайте попробуем разобраться со следующим примером:

[vishrant@localhost]$ SOME_ENV_VARIABLE="testing.txt" #creating variable in bash shell [vishrant@localhost]$ echo $SOME_ENV_VARIABLE testing.txt [vishrant@localhost]$ export SOME_ENV_VARIABLE #variable now available with environment [vishrant@localhost]$ env | grep SOME_ENV_VARIABLE SOME_ENV_VARIABLE=testing.txt [vishrant@localhost]$ csh #changing shell [vishrant@localhost ~/shell_scripting]$ echo $SOME_ENV_VARIABLE testing.txt [vishrant@localhost ~/shell_scripting]$ exit exit #returned to parent shell [vishrant@localhost]$ SOME_SHELL_VARIABLE="hello.txt" [vishrant@localhost]$ csh [vishrant@localhost ~/shell_scripting]$ echo $SOME_SHELL_VARIABLE SOME_SHELL_VARIABLE: Undefined variable.

Аналогия: предположим, у вас есть квартира с двумя спальнями, и вы делитесь ею с другим соседом по комнате. С общей зоной можно связаться кто угодно, но не ваши спальни, переменная окружения подобна общей области, а переменная оболочки похожа на спальню, если вы будете что-то в общей области, к которой может обратиться любой, но если вы храните ее в своей спальне, она может

Помните, если открыть новый терминал, вы не сможете получить доступ к какой-либо из переменных, потому что вы меняете Analogy: . Для этого вы должны добавить свои переменные в .profile или .bashrc (если вы используете bash).

0
ответ дан 2 August 2018 в 03:55

Чтобы ответить на этот вопрос, сначала попробуйте понять область видимости переменной.

Когда вы создаете новую переменную типа SOME_ENV_VARIABLE = "testing.txt" , она находится в папке SHELL scope , это означает, что к нему можно получить доступ к этому экземпляру оболочки, где пользователь вошел в систему. Когда экземпляр меняет, например, вы открываете новый терминал или вы меняете оболочку (например, вы переключаетесь на ] csh ), вы не можете получить доступ к этой переменной.

Когда вы экспортируете такую ​​переменную, как , экспортируйте SOME_ENV_VARIABLE , эта переменная теперь доступна в области среды, что означает в этом случае если вы измените оболочку, вы можете по-прежнему получить доступ к этой переменной. Давайте попробуем разобраться со следующим примером:

  [vishrant @ localhost] $ SOME_ENV_VARIABLE = "testing.txt" #creating переменная в оболочке bash [vishrant @ localhost] $ echo $ SOME_ENV_VARIABLE test.txt [  vishrant @ localhost] $ export SOME_ENV_VARIABLE #variable теперь доступен с помощью среды [vishrant @ localhost] $ env |  grep SOME_ENV_VARIABLE SOME_ENV_VARIABLE = test.txt [vishrant @ localhost] $ csh #changing shell [vishrant @ localhost ~ / shell_scripting] $ echo $ SOME_ENV_VARIABLE test.txt [vishrant @ localhost ~ / shell_scripting] $ exit exit # возвращено к исходной оболочке [vishrant  @localhost] $ SOME_SHELL_VARIABLE = "hello.txt" [vishrant @ localhost] $ csh [vishrant @ localhost ~ / shell_scripting] $ echo $ SOME_SHELL_VARIABLE SOME_SHELL_VARIABLE: Неопределенная переменная.   

Аналогия: предположим, у вас есть квартира с двумя спальнями, и вы делитесь ею с другим соседом по комнате. С общей зоной можно связаться кто угодно, но не ваши спальни, переменная окружения подобна общей области, а переменная оболочки похожа на спальню, если вы будете что-то в общей области, к которой может обратиться любой, но если вы храните ее в своей спальне, она может доступ к вам.

Помните, если открыть новый терминал, вы не сможете получить доступ к любой из переменных, потому что вы меняете этот экземпляр. Для этого вы должны добавить свои переменные в файл .profile или .bashrc (если вы используете bash).

0
ответ дан 4 August 2018 в 19:58

Shell Variable: Short Term, применяется только к текущему экземпляру оболочки, не применимо к системе

Экологическая переменная: долгосрочное использование, допустимая системная ширина, разрешено во всем мире

By условные переменные Shell Variable имеют свое имя в нижнем регистре, а Envn. Переменные записываются как прописные буквы

2
ответ дан 4 August 2018 в 19:58

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

Примеры для пояснения:

  $ SOME = VAR # define shell variable $ НЕКОТОРЫЕ $ echo $ НЕКОТОРЫЕ VAR $ env |  grep НЕКОТОРЫЕ # примечание: no output $ export НЕКОТОРЫЕ # turn $ SOME в переменную окружения $ env |  grep НЕКОТОРЫЙ SOME = VAR  

Другой способ определить переменную среды:

  $ export ДРУГОЙ = VALUE $ echo $ ДРУГИЕ ЗНАЧЕНИЯ $ env |  grep ДРУГОЙ ДРУГОЙ = VALUE  
34
ответ дан 4 August 2018 в 19:58

Есть разница. Переменные оболочки и переменные окружения объяснят это лучше, чем я могу, но вот отрывок из него:

Если внесено изменение в переменную оболочки, она должна быть явно «экспортирован» в соответствующую переменную среды, чтобы любые разветвленные подпроцессы могли видеть изменение. Напомним, что переменные оболочки являются локальными для оболочки, в которой они были определены.

7
ответ дан 4 August 2018 в 19:58

Чтобы ответить на этот вопрос, сначала попробуйте понять область видимости переменной.

Когда вы создаете новую переменную типа SOME_ENV_VARIABLE = "testing.txt" , она находится в папке SHELL scope , это означает, что к нему можно получить доступ к этому экземпляру оболочки, где пользователь вошел в систему. Когда экземпляр меняет, например, вы открываете новый терминал или вы меняете оболочку (например, вы переключаетесь на ] csh ), вы не можете получить доступ к этой переменной.

Когда вы экспортируете такую ​​переменную, как , экспортируйте SOME_ENV_VARIABLE , эта переменная теперь доступна в области среды, что означает в этом случае если вы измените оболочку, вы можете по-прежнему получить доступ к этой переменной. Давайте попробуем разобраться со следующим примером:

  [vishrant @ localhost] $ SOME_ENV_VARIABLE = "testing.txt" #creating переменная в оболочке bash [vishrant @ localhost] $ echo $ SOME_ENV_VARIABLE test.txt [  vishrant @ localhost] $ export SOME_ENV_VARIABLE #variable теперь доступен с помощью среды [vishrant @ localhost] $ env |  grep SOME_ENV_VARIABLE SOME_ENV_VARIABLE = test.txt [vishrant @ localhost] $ csh #changing shell [vishrant @ localhost ~ / shell_scripting] $ echo $ SOME_ENV_VARIABLE test.txt [vishrant @ localhost ~ / shell_scripting] $ exit exit # возвращено к исходной оболочке [vishrant  @localhost] $ SOME_SHELL_VARIABLE = "hello.txt" [vishrant @ localhost] $ csh [vishrant @ localhost ~ / shell_scripting] $ echo $ SOME_SHELL_VARIABLE SOME_SHELL_VARIABLE: Неопределенная переменная.   

Аналогия: предположим, у вас есть квартира с двумя спальнями, и вы делитесь ею с другим соседом по комнате. С общей зоной можно связаться кто угодно, но не ваши спальни, переменная окружения подобна общей области, а переменная оболочки похожа на спальню, если вы будете что-то в общей области, к которой может обратиться любой, но если вы храните ее в своей спальне, она может доступ к вам.

Помните, если открыть новый терминал, вы не сможете получить доступ к любой из переменных, потому что вы меняете этот экземпляр. Для этого вы должны добавить свои переменные в файл .profile или .bashrc (если вы используете bash).

0
ответ дан 6 August 2018 в 04:01

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

Примеры для пояснения:

  $ SOME = VAR # define shell variable $ НЕКОТОРЫЕ $ echo $ НЕКОТОРЫЕ VAR $ env |  grep НЕКОТОРЫЕ # примечание: no output $ export НЕКОТОРЫЕ # turn $ SOME в переменную окружения $ env |  grep НЕКОТОРЫЙ SOME = VAR  

Другой способ определить переменную среды:

  $ export ДРУГОЙ = VALUE $ echo $ ДРУГИЕ ЗНАЧЕНИЯ $ env |  grep ДРУГОЙ ДРУГОЙ = VALUE  
34
ответ дан 6 August 2018 в 04:01

Есть разница. Переменные оболочки и переменные окружения объяснят это лучше, чем я могу, но вот отрывок из него:

Если внесено изменение в переменную оболочки, она должна быть явно «экспортирован» в соответствующую переменную среды, чтобы любые разветвленные подпроцессы могли видеть изменение. Напомним, что переменные оболочки являются локальными для оболочки, в которой они были определены.

7
ответ дан 6 August 2018 в 04:01

Shell Variable: Short Term, применяется только к текущему экземпляру оболочки, не применимо к системе

Экологическая переменная: долгосрочное использование, допустимая системная ширина, разрешено во всем мире

By условные переменные Shell Variable имеют свое имя в нижнем регистре, а Envn. Переменные записываются как прописные буквы

2
ответ дан 6 August 2018 в 04:01

Чтобы ответить на этот вопрос, сначала попробуйте понять область видимости переменной.

Когда вы создаете новую переменную типа SOME_ENV_VARIABLE = "testing.txt" , она находится в папке SHELL scope , это означает, что к нему можно получить доступ к этому экземпляру оболочки, где пользователь вошел в систему. Когда экземпляр меняет, например, вы открываете новый терминал или вы меняете оболочку (например, вы переключаетесь на ] csh ), вы не можете получить доступ к этой переменной.

Когда вы экспортируете такую ​​переменную, как , экспортируйте SOME_ENV_VARIABLE , эта переменная теперь доступна в области среды, что означает в этом случае если вы измените оболочку, вы можете по-прежнему получить доступ к этой переменной. Давайте попробуем разобраться со следующим примером:

  [vishrant @ localhost] $ SOME_ENV_VARIABLE = "testing.txt" #creating переменная в оболочке bash [vishrant @ localhost] $ echo $ SOME_ENV_VARIABLE test.txt [  vishrant @ localhost] $ export SOME_ENV_VARIABLE #variable теперь доступен с помощью среды [vishrant @ localhost] $ env |  grep SOME_ENV_VARIABLE SOME_ENV_VARIABLE = test.txt [vishrant @ localhost] $ csh #changing shell [vishrant @ localhost ~ / shell_scripting] $ echo $ SOME_ENV_VARIABLE test.txt [vishrant @ localhost ~ / shell_scripting] $ exit exit # возвращено к исходной оболочке [vishrant  @localhost] $ SOME_SHELL_VARIABLE = "hello.txt" [vishrant @ localhost] $ csh [vishrant @ localhost ~ / shell_scripting] $ echo $ SOME_SHELL_VARIABLE SOME_SHELL_VARIABLE: Неопределенная переменная.   

Аналогия: предположим, у вас есть квартира с двумя спальнями, и вы делитесь ею с другим соседом по комнате. С общей зоной можно связаться кто угодно, но не ваши спальни, переменная окружения подобна общей области, а переменная оболочки похожа на спальню, если вы будете что-то в общей области, к которой может обратиться любой, но если вы храните ее в своей спальне, она может доступ к вам.

Помните, если открыть новый терминал, вы не сможете получить доступ к любой из переменных, потому что вы меняете этот экземпляр. Для этого вы должны добавить свои переменные в файл .profile или .bashrc (если вы используете bash).

0
ответ дан 7 August 2018 в 21:59

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

Примеры для пояснения:

  $ SOME = VAR # define shell variable $ НЕКОТОРЫЕ $ echo $ НЕКОТОРЫЕ VAR $ env |  grep НЕКОТОРЫЕ # примечание: no output $ export НЕКОТОРЫЕ # turn $ SOME в переменную окружения $ env |  grep НЕКОТОРЫЙ SOME = VAR  

Другой способ определить переменную среды:

  $ export ДРУГОЙ = VALUE $ echo $ ДРУГИЕ ЗНАЧЕНИЯ $ env |  grep ДРУГОЙ ДРУГОЙ = VALUE  
34
ответ дан 7 August 2018 в 21:59

Есть разница. Переменные оболочки и переменные окружения объяснят это лучше, чем я могу, но вот отрывок из него:

Если внесено изменение в переменную оболочки, она должна быть явно «экспортирован» в соответствующую переменную среды, чтобы любые разветвленные подпроцессы могли видеть изменение. Напомним, что переменные оболочки являются локальными для оболочки, в которой они были определены.

7
ответ дан 7 August 2018 в 21:59

Shell Variable: Short Term, применяется только к текущему экземпляру оболочки, не применимо к системе

Экологическая переменная: долгосрочное использование, допустимая системная ширина, разрешено во всем мире

By условные переменные Shell Variable имеют свое имя в нижнем регистре, а Envn. Переменные записываются как прописные буквы

2
ответ дан 7 August 2018 в 21:59

Чтобы ответить на этот вопрос, сначала попробуйте понять область видимости переменной.

Когда вы создаете новую переменную типа SOME_ENV_VARIABLE = "testing.txt" , она находится в папке SHELL scope , это означает, что к нему можно получить доступ к этому экземпляру оболочки, где пользователь вошел в систему. Когда экземпляр меняет, например, вы открываете новый терминал или вы меняете оболочку (например, вы переключаетесь на ] csh ), вы не можете получить доступ к этой переменной.

Когда вы экспортируете такую ​​переменную, как , экспортируйте SOME_ENV_VARIABLE , эта переменная теперь доступна в области среды, что означает в этом случае если вы измените оболочку, вы можете по-прежнему получить доступ к этой переменной. Давайте попробуем разобраться со следующим примером:

  [vishrant @ localhost] $ SOME_ENV_VARIABLE = "testing.txt" #creating переменная в оболочке bash [vishrant @ localhost] $ echo $ SOME_ENV_VARIABLE test.txt [  vishrant @ localhost] $ export SOME_ENV_VARIABLE #variable теперь доступен с помощью среды [vishrant @ localhost] $ env |  grep SOME_ENV_VARIABLE SOME_ENV_VARIABLE = test.txt [vishrant @ localhost] $ csh #changing shell [vishrant @ localhost ~ / shell_scripting] $ echo $ SOME_ENV_VARIABLE test.txt [vishrant @ localhost ~ / shell_scripting] $ exit exit # возвращено к исходной оболочке [vishrant  @localhost] $ SOME_SHELL_VARIABLE = "hello.txt" [vishrant @ localhost] $ csh [vishrant @ localhost ~ / shell_scripting] $ echo $ SOME_SHELL_VARIABLE SOME_SHELL_VARIABLE: Неопределенная переменная.   

Аналогия: предположим, у вас есть квартира с двумя спальнями, и вы делитесь ею с другим соседом по комнате. С общей зоной можно связаться кто угодно, но не ваши спальни, переменная окружения подобна общей области, а переменная оболочки похожа на спальню, если вы будете что-то в общей области, к которой может обратиться любой, но если вы храните ее в своей спальне, она может доступ к вам.

Помните, если открыть новый терминал, вы не сможете получить доступ к любой из переменных, потому что вы меняете этот экземпляр. Для этого вы должны добавить свои переменные в файл .profile или .bashrc (если вы используете bash).

0
ответ дан 10 August 2018 в 10:13

Есть разница. Переменные оболочки и переменные окружения объяснят это лучше, чем я могу, но вот отрывок из него:

Если внесено изменение в переменную оболочки, она должна быть явно «экспортирован» в соответствующую переменную среды, чтобы любые разветвленные подпроцессы могли видеть изменение. Напомним, что переменные оболочки являются локальными для оболочки, в которой они были определены.

7
ответ дан 10 August 2018 в 10:13

Shell Variable: Short Term, применяется только к текущему экземпляру оболочки, не применимо к системе

Экологическая переменная: долгосрочное использование, допустимая системная ширина, разрешено во всем мире

By условные переменные Shell Variable имеют свое имя в нижнем регистре, а Envn. Переменные записываются как прописные буквы

2
ответ дан 10 August 2018 в 10:13

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

Примеры для пояснения:

  $ SOME = VAR # define shell variable $ НЕКОТОРЫЕ $ echo $ НЕКОТОРЫЕ VAR $ env |  grep НЕКОТОРЫЕ # примечание: no output $ export НЕКОТОРЫЕ # turn $ SOME в переменную окружения $ env |  grep НЕКОТОРЫЙ SOME = VAR  

Другой способ определить переменную среды:

  $ export ДРУГОЙ = VALUE $ echo $ ДРУГИЕ ЗНАЧЕНИЯ $ env |  grep ДРУГОЙ ДРУГОЙ = VALUE  
34
ответ дан 10 August 2018 в 10:13

Чтобы ответить на этот вопрос, сначала попробуйте понять область видимости переменной.

Когда вы создаете новую переменную типа SOME_ENV_VARIABLE = "testing.txt" , она находится в папке SHELL scope , это означает, что к нему можно получить доступ к этому экземпляру оболочки, где пользователь вошел в систему. Когда экземпляр меняет, например, вы открываете новый терминал или вы меняете оболочку (например, вы переключаетесь на ] csh ), вы не можете получить доступ к этой переменной.

Когда вы экспортируете такую ​​переменную, как , экспортируйте SOME_ENV_VARIABLE , эта переменная теперь доступна в области среды, что означает в этом случае если вы измените оболочку, вы можете по-прежнему получить доступ к этой переменной. Давайте попробуем разобраться со следующим примером:

  [vishrant @ localhost] $ SOME_ENV_VARIABLE = "testing.txt" #creating переменная в оболочке bash [vishrant @ localhost] $ echo $ SOME_ENV_VARIABLE test.txt [  vishrant @ localhost] $ export SOME_ENV_VARIABLE #variable теперь доступен с помощью среды [vishrant @ localhost] $ env |  grep SOME_ENV_VARIABLE SOME_ENV_VARIABLE = test.txt [vishrant @ localhost] $ csh #changing shell [vishrant @ localhost ~ / shell_scripting] $ echo $ SOME_ENV_VARIABLE test.txt [vishrant @ localhost ~ / shell_scripting] $ exit exit # возвращено к исходной оболочке [vishrant  @localhost] $ SOME_SHELL_VARIABLE = "hello.txt" [vishrant @ localhost] $ csh [vishrant @ localhost ~ / shell_scripting] $ echo $ SOME_SHELL_VARIABLE SOME_SHELL_VARIABLE: Неопределенная переменная.   

Аналогия: предположим, у вас есть квартира с двумя спальнями, и вы делитесь ею с другим соседом по комнате. С общей зоной можно связаться кто угодно, но не ваши спальни, переменная окружения подобна общей области, а переменная оболочки похожа на спальню, если вы будете что-то в общей области, к которой может обратиться любой, но если вы храните ее в своей спальне, она может доступ к вам.

Помните, если открыть новый терминал, вы не сможете получить доступ к любой из переменных, потому что вы меняете этот экземпляр. Для этого вы должны добавить свои переменные в файл .profile или .bashrc (если вы используете bash).

0
ответ дан 13 August 2018 в 16:36

Есть разница. Переменные оболочки и переменные окружения объяснят это лучше, чем я могу, но вот отрывок из него:

Если внесено изменение в переменную оболочки, она должна быть явно «экспортирован» в соответствующую переменную среды, чтобы любые разветвленные подпроцессы могли видеть изменение. Напомним, что переменные оболочки являются локальными для оболочки, в которой они были определены.

7
ответ дан 13 August 2018 в 16:36
  • 1
    Я комментирую свой собственный ответ. Мне очень нравится ссылка Help Ubuntu в ответе Takkat ... (это лучше, чем у меня) – Peter.O 14 February 2011 в 18:46
  • 2
    Плюс ваша ссылка больше не работает! – user 19 September 2017 в 18:19

Shell Variable: Short Term, применяется только к текущему экземпляру оболочки, не применимо к системе

Экологическая переменная: долгосрочное использование, допустимая системная ширина, разрешено во всем мире

By условные переменные Shell Variable имеют свое имя в нижнем регистре, а Envn. Переменные записываются как прописные буквы

2
ответ дан 13 August 2018 в 16:36

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

Примеры для пояснения:

  $ SOME = VAR # define shell variable $ НЕКОТОРЫЕ $ echo $ НЕКОТОРЫЕ VAR $ env |  grep НЕКОТОРЫЕ # примечание: no output $ export НЕКОТОРЫЕ # turn $ SOME в переменную окружения $ env |  grep НЕКОТОРЫЙ SOME = VAR  

Другой способ определить переменную среды:

  $ export ДРУГОЙ = VALUE $ echo $ ДРУГИЕ ЗНАЧЕНИЯ $ env |  grep ДРУГОЙ ДРУГОЙ = VALUE  
34
ответ дан 13 August 2018 в 16:36
  • 1
    Я не думаю, что это правильно. export не обязательно устанавливает переменную среды. [D0] stackoverflow.com/questions/7411455/&hellip – Chris Stryczynski 17 November 2017 в 21:41
  • 2
    @ChrisStryczynski export устанавливает переменную среды для дочерних процессов. Сообщение, которое вы связываете, не противоречит этому ответу, не могли бы вы объяснить, почему вы считаете, что это неправильно? – Lekensteyn 20 November 2017 в 03:12

Другие вопросы по тегам:

Похожие вопросы: