Chinaunix

标题: [结贴]set设置的环境变量,似乎是当前shell的而不是全局的? [打印本页]

作者: wqrocdr    时间: 2015-05-06 10:39
标题: [结贴]set设置的环境变量,似乎是当前shell的而不是全局的?
本帖最后由 wqrocdr 于 2015-05-07 09:09 编辑

例如,我登录到bash里面,然后我再进一层bash:

  1. bash
  2. :~$ set a=2
  3. :~$ exit
  4. exit
  5. :~$ echo $a

  6. :~$
复制代码
我的理解是: 用set命令定义一个变量,这个变量就成为环境变量了,环境变量是全局的吧? 但是从我的实验看起来,环境变量只是当前shell以及它的子shell里面有效。
那么这个和普通的变量声明a=2有什么区别呢? 变量的作用域和生命周期都是一样的啊,那么环境变量和普通变量的区别只是用env命令能否看见?
作者: bedba    时间: 2015-05-06 13:56
set或者export出来的环境变量都只在本会话有效,本会话退出后即失效。不管是UNIX还是LINUX或者WINDOWS都是如此。

要让环境变量在退出会话后依然有效,则需要在用户登录的profile里添加此环境变量的声明,或者在系统级别的参数中设置此环境变量
作者: Shell_HAT    时间: 2015-05-06 14:17
Windows是把环境变量的定义放在注册表里面
Linux是把环境变量的定义放在 /etc/profile 或者用户自己的 login profile 里面
作者: wqrocdr    时间: 2015-05-06 17:23
bedba 发表于 2015-05-06 13:56
set或者export出来的环境变量都只在本会话有效,本会话退出后即失效。不管是UNIX还是LINUX或者WINDOWS都是如 ...


那set和export的本质区别在哪里呢?
作者: lyhabc    时间: 2015-05-06 23:35
本帖最后由 lyhabc 于 2015-05-06 23:38 编辑

系统环境变量
env
set  自定义变量也可以查
unset
export 定义全局变量



打印当前用户内置变量 用户不同 变量不同
env

所有变量全部列出来 不管有没有声明都可以列出来
set

声明(全局变量 )在子shell生效  全局生效 需要export一下
export a=1

bash开一个子shell

env 就可以看到a=1 ,因为a是全局变量


系统所有用户使用变量: export myname=Aming  全局变量,加入/etc/profile并source /etc/profile永久生效
系统某个用户使用变量: export myname=Aming 加入当前用户家目录下的 .bashrc中 source .bashrc
export myname=Aming  全局变量,export 不加任何选项表示,声明所有的环境变量以及用户自定义变量


env 可以列出当前用户的所有环境变量以及用户自定义全局变量
set命令可以把所有变量列出来包括系统的和自定义的全局变量以及当前shell自定义变量

set 和export
set 正如其名,他只是set一下,范围不是全局的,他没有声明的意思
export 他是声明的意思,所以他在可以全局声明,而set做不到

作者: bedba    时间: 2015-05-07 08:23
回复 4# wqrocdr


    可参考五楼的。

另外,不太赞同五楼的全局或者非全局的说法,我的本意是set和export的使用不同,例如set可以在windows或者csh下设置,export可以在bash、sh、ksh等环境下设置




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2