首先推荐一个命令说明中文网站linuxde
今天介绍
- 命令及环境设置有关的Unix命令:type, which。
- 环境变量,脚本以及shebang基本概念。
- 针对易混淆的Unix shell内置命令export, set与Unix命令env进行阐述。
- source, sh的用法的区别,使用场景介绍。
Shell命令
1.type
type命令返回指定命令的类型的描述,判断给出的命令是外部命令还是内部命令。
使用直接type 命令
,将返回命令的类型描述,所在的位置
命令类型有以下几种:
- alias:别名。
- keyword:关键字,Shell保留字。
- function:函数,Shell函数。
- builtin:内建命令,Shell内建命令。
- file:文件,磁盘文件,外部命令。
-
unfound:没有找到
2. which
which命令返回所查询命令的绝对地址到屏幕上。
输入which命令会到所设置的环境变量目录里去寻找命令所在位置并默认返回第一个匹配值。
环境变量:
环境变量(environment variables)一般是指在操作系统中用来指定操作系统运行环境的一些参数,如:临时文件夹位置和系统文件夹位置等。
环境变量是在操作系统中一个具有特定名字的对象,它包含了一个或者多个应用程序所将使用到的信息。例如Windows和DOS操作系统中的path环境变量,当要求系统运行一个程序而没有告诉它程序所在的完整路径时,系统除了在当前目录下面寻找此程序外,还应到path中指定的路径去找。用户通过设置环境变量,来更好的运行进程。
--参考百度百科
--以下是WIKI的总结.
环境变量最开始是由于fork,exec的需要,即调用其他程序时,Unix系统会先fork即复制caller程序本身,子程序会继承caller的非生成的环境变量并做相应的设置,然后exec即子程序被要调用的程序覆盖,这样做可以使调用程序正确获得合适的路径或防止调用程序造成恶意攻击。
维基上的解释为环境变量为动态命名的变量,它们会影响执行的进行的动作,比如到哪里去寻找合适文件夹位置去访问或存放数据,比如TEMP是存放临时数据,USERPROFILE可以获取被用户所有的目录结构等。
环境变量的特点:
- 通过SET或VARIABLENAME=value, export VARIABLENAME等方式设置的环境变量仅仅在本地当前的进程有效(即在被设置的当前终端有效), 新建终端将无法使用
- 当子进程被建立时,它将会继承父进程的环境变量
- 环境变量是区分大小写的
例子:创建一个环境变量,并显示它
可以通过echo $PATH
或echo $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 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, export在sh和bash中显示的输出格式可能有所差别,在sh中set,export输出显示格式一致,而bash中export输出以declar -x var=value显示。
总结:
- 不是所有的shell变量都是环境变量
- set命令将列出所有的变量和函数
- export命令将列出环境变量
- set 与 export 命令是集成到shell里的
- env命令(无参数)将列出所执行env命令的进程从其父进程中继承的环境变量
source与.命令和shell script的区别
source命令在bash或其他类似的POSIX shell中可以缩写成.命令,但在C shell中不行,source命令最早是在C shell中出现的。
下面介绍下什么情况下使用source命令再通过例子来对比其与shell script的不同之处。
- 脚本里有cd命令,而且用户希望执行完脚本后立刻进入那个目录。
- 脚本里有export命令,而且用户希望执行完脚本后环境变量的修改立刻反馈到当前的shell里。
- 在脚本没有执行的权限,使用source命令可强制执行该脚本。
shell script与source的区别:
使用shell script执行脚本将创建一个subshell进行执行,环境变量仅在subshell有效,关闭subshell后将失效,这就是为什么直接使用shell命令export在当前终端中设置变量后,重新打开一个终端设置无效了,这时需要将环境变量的设置写入到./bashrc里,然后通过source ./bashrc
执行,执行完后在当前终端(current context)生效,并且重新打开终端也会生效。
实例1:source会强制在当前终端是设置的环境变量生效,而sh则通过生成子shell,命令结束后变量无法export
实例2:source 与 sh 执行含有cd命令的脚本不同
以上则是针对环境变量概念及脚本概念的相关介绍,并针对容易混淆的命令进行了区分,简要介绍了Unix环境变量的执行过程。