每天一点命令行2-Unix环境变量

首先推荐一个命令说明中文网站linuxde

今天介绍

  1. 命令及环境设置有关的Unix命令:type, which。
  2. 环境变量,脚本以及shebang基本概念。
  3. 针对易混淆的Unix shell内置命令export, set与Unix命令env进行阐述。
  4. source, sh的用法的区别,使用场景介绍。

Shell命令

1.type

type命令返回指定命令的类型的描述,判断给出的命令是外部命令还是内部命令。
使用直接type 命令,将返回命令的类型描述,所在的位置
命令类型有以下几种

  • alias:别名。
  • keyword:关键字,Shell保留字。
  • function:函数,Shell函数。
  • builtin:内建命令,Shell内建命令。
  • file:文件,磁盘文件,外部命令。
  • unfound:没有找到


    type

2. which

which命令返回所查询命令的绝对地址到屏幕上。
输入which命令会到所设置的环境变量目录里去寻找命令所在位置并默认返回第一个匹配值。


which

环境变量:

环境变量(environment variables)一般是指在操作系统中用来指定操作系统运行环境的一些参数,如:临时文件夹位置和系统文件夹位置等。

环境变量是在操作系统中一个具有特定名字的对象,它包含了一个或者多个应用程序所将使用到的信息。例如Windows和DOS操作系统中的path环境变量,当要求系统运行一个程序而没有告诉它程序所在的完整路径时,系统除了在当前目录下面寻找此程序外,还应到path中指定的路径去找。用户通过设置环境变量,来更好的运行进程。

--参考百度百科

--以下是WIKI的总结.
环境变量最开始是由于fork,exec的需要,即调用其他程序时,Unix系统会先fork即复制caller程序本身,子程序会继承caller的非生成的环境变量并做相应的设置,然后exec即子程序被要调用的程序覆盖,这样做可以使调用程序正确获得合适的路径或防止调用程序造成恶意攻击。

维基上的解释为环境变量为动态命名的变量,它们会影响执行的进行的动作,比如到哪里去寻找合适文件夹位置去访问或存放数据,比如TEMP是存放临时数据,USERPROFILE可以获取被用户所有的目录结构等。

环境变量的特点:

  1. 通过SET或VARIABLENAME=value, export VARIABLENAME等方式设置的环境变量仅仅在本地当前的进程有效(即在被设置的当前终端有效), 新建终端将无法使用
  2. 当子进程被建立时,它将会继承父进程的环境变量
  3. 环境变量是区分大小写的
    例子:创建一个环境变量,并显示它
    env

    可以通过echo $PATHecho $HOME看PATH或HOME里有哪些环境变量

脚本:

介绍Unix类系统脚本概念,即shell script. DOS及Windows参考Batch file, 或CMD.exe。
script英语为剧本意思,shell script是指一种计算机程序,设计为被Unix shell执行的一种命令行解释器, 注意是解释器,类似剧本,一幕一幕地去演绎,Python同样也是由解释器进行动态解释,故Python也被称为脚本语言。与之相反的是需要编译后执行的,如C等,类似电影,需要编译录制后在播放。
写好script,要通过shell script进行执行,如sh demo将通过sh解释执行demo脚本。

常见的shell script有sh(Bourne shell, 诞生于Unix,最早于Version 7 Unix上搭载,符合POSIX 标准), bash(Bourne Again Shell,Brian Fox为了GNU Project免费软件的提倡所写的), 此外还有ssh等。由于在绝大多数GNU/Linux系统上,sh一直以来都被用作指向bash,故通常用bash和sh都是一样的效果。但其实这两个是不同的,sh是一个specification, 而它有很多的implementation, bash仅仅是其中一个默认使用最多的implementation(bash由于开源等,有许多扩展,导致其后续不再是有效的POSIX shell,变成一种变种,但bash添加了--posix兼容选项)。

在Script里,我们其实可以指定使用哪个shell script,通过在首行插入Shebang行,例如#!/bin/sh 将使用sh或任何sh所指向implementation来解释脚本,#!/bin/bash将使用bash来执行。
具体sh/bash区别可以参考这里

SheBang

Shebang是位于脚本首行,以!#开头的字符串,用于指定特定的解释器来执行脚本语言。

Shell命令set/export 与 env 的区别

set与export为shell(sh,bash)等内置的命令。
env为Unix外部命令,不是shell自带的,显示环境变量仅仅是其一个功能。

在shell中直接输入set,将显示用户环境变量, 未被导出到环境的变量(regular variable)以及函数功能定义

在shell中直接输入export或env,将显示以不同格式呈现的环境变量,输出的都是同样的环境变量,仅仅格式不一样。

export

用来设置(添加&删除)和显示环境变量。
命令用法如下:
export [-fnp][变量名称]=[变量设置值]
参数说明:
-f  代表[变量名称]中为函数名称。
-n  删除指定的变量。变量实际上并未删除,只是不会输出到后续指令的执行环境中。
-p  列出所有的shell赋予程序的环境变量。
设置实例如下:
export PATH="需要设置的路径:$PATH
这句话是将要设置的路径添加到环境变量里,且添加到PATH目录的开头。添加到环境变量后,在终端输入的脚本名称或命令名称就可被直接执行。系统将从所有的环境变量中进行寻找该名称。
以上若要添加到PATH路径末尾,可以改为$PATH:需要设置的路径。
下面是一个例子,将documents里的Linux文件夹添加到PATH目录末尾,这样就可以直接在shell终端输入Linux文件夹里的脚本文件进行执行。

export

可看到通过export PATH="$PATH:~/documents/Linux"命令后,将~/documents/Linux路径添加到了PATH路径的末尾,而通过export命令也可以看到在PATH里多了一个路径。

若是在终端建立一个变量,不使用export命令,则该变量仅仅能通过set显示,实例如下:

$ x1=123
$ x2=234; export x2
$ export x3=345

运行上述代码后使用set可以显示已经被export的x2, x3和未被导出的x1,而env和export命令只能显示x2,x3


set

注意以上set, export在sh和bash中显示的输出格式可能有所差别,在sh中set,export输出显示格式一致,而bash中export输出以declar -x var=value显示。

总结:

  1. 不是所有的shell变量都是环境变量
  2. set命令将列出所有的变量和函数
  3. export命令将列出环境变量
  4. set 与 export 命令是集成到shell里的
  5. env命令(无参数)将列出所执行env命令的进程从其父进程中继承的环境变量

source与.命令和shell script的区别

source命令在bash或其他类似的POSIX shell中可以缩写成.命令,但在C shell中不行,source命令最早是在C shell中出现的。

下面介绍下什么情况下使用source命令再通过例子来对比其与shell script的不同之处。

  1. 脚本里有cd命令,而且用户希望执行完脚本后立刻进入那个目录。
  2. 脚本里有export命令,而且用户希望执行完脚本后环境变量的修改立刻反馈到当前的shell里。
  3. 在脚本没有执行的权限,使用source命令可强制执行该脚本。

shell script与source的区别:
使用shell script执行脚本将创建一个subshell进行执行,环境变量仅在subshell有效,关闭subshell后将失效,这就是为什么直接使用shell命令export在当前终端中设置变量后,重新打开一个终端设置无效了,这时需要将环境变量的设置写入到./bashrc里,然后通过source ./bashrc执行,执行完后在当前终端(current context)生效,并且重新打开终端也会生效。

实例1:source会强制在当前终端是设置的环境变量生效,而sh则通过生成子shell,命令结束后变量无法export

source-1.png

实例2:source 与 sh 执行含有cd命令的脚本不同


source-sh.png

以上则是针对环境变量概念及脚本概念的相关介绍,并针对容易混淆的命令进行了区分,简要介绍了Unix环境变量的执行过程。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,402评论 6 499
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,377评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,483评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,165评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,176评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,146评论 1 297
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,032评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,896评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,311评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,536评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,696评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,413评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,008评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,659评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,815评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,698评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,592评论 2 353