Update export.md

对内容进行了优化
This commit is contained in:
ZhuangZhu-74 2019-06-21 14:54:33 +08:00 committed by GitHub
parent ca67517277
commit 2a6ac8a21c
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 157 additions and 15 deletions

View File

@ -1,31 +1,173 @@
export
===
## export
设置或显示系统环境变量
为shell变量或函数设置导出属性。
## 补充说明
### 概要
**export命令** 用于将shell变量输出为环境变量或者将shell函数输出为环境变量。
export [-fn] [name[=word]]...
一个变量创建时它不会自动地为在它之后创建的shell进程所知。而命令export可以向后面的shell传递变量的值。当一个shell脚本调用并执 行时它不会自动得到原为脚本调用者里定义的变量的访问权除非这些变量已经被显式地设置为可用。export命令可以用于传递一个或多个变量的值到任何后继脚本。
export -p
### 语法
### 主要用途
- 新建一到多个变量并设置导出属性。
- 修改一到多个拥有导出属性的变量的值。
- 删除一到多个变量的导出属性。
- 显示全部拥有导出属性的变量。
- 为一到多个已定义函数新增导出属性。
- 删除一到多个函数的导出属性。
- 显示全部拥有导出属性的函数。
#### 选项
-p显示全部拥有导出属性的变量。
-pf显示全部拥有导出属性的函数。
-n删除变量的导出属性。
-nf删除变量的导出属性。
-f指向函数。
--:在它之后的选项无效。
#### 参数
name可选变量名或已定义函数名。
value可选变量的值。
#### 返回值
export返回true除非你提供了非法选项或非法名称。
### 例子
常见用法
```shell
export(选项)(参数)
# 显示全部拥有导出属性的变量。
# export -p
# export
# 显示全部拥有导出属性的函数。
# export -pf
```
### 选项
```shell
-f代表[变量名称]中为函数名称;
-n删除指定的变量。变量实际上并未删除只是不会输出到后续指令的执行环境中
-p列出所有的shell赋予程序的环境变量。
#首先删除要演示的变量名
#unset a b
#新建变量的同时增加导出属性
export a b=3
#当然也可以这样
b=3
export b
#修改拥有导出属性的变量的值
export a=5 b=7
#当然也可以直接赋值修改
a=5;b=7
#删除变量的导出属性
export -n a b
```
### 参数
变量:指定要输出或者删除的环境变量。
```
#首先删除要演示的函数名
unset func_1 func_2
#创建函数
function func_1(){ echo '123'; }
function func_2(){ echo '890'; }
#为已定义函数增加导出属性
export -f func_1 func_2
#删除函数的导出属性
export -fn a b
```
### 错误用法
- 对未定义的函数添加导出属性。
- 对没有导出属性的函数/变量执行删除导出属性操作。
- 在`--`后使用选项。
### Q&A
Q对变量或函数设置导出属性有什么用
A它们会成为环境变量可以在脚本中访问它们尤其是脚本中调用的子进程需要时。 **参考链接4**
Q如果我编写的脚本修改了已有的环境变量的值那么执行它会在当前终端生效吗会影响之前以及之后打开的终端吗
A只有通过`source`方式调用的脚本会生效,您可以查看`source`命令获得更多信息其他方式只是在子shell中执行。
之前的不会影响,之后的除非是修改了`~/.bashrc`这种启动终端时加载的脚本。( **参考链接1**
Q我脚本文件中调用`~/.bashrc`中定义的函数和变量。为什么在新打开的终端中通过 `sh` 方式调用该脚本或直接运行
这个当前用户有执行权限的脚本却不能使用这些函数和变量?
A请在`~/.bashrc`文件中增加export它们的语句。另请参阅 **知识点** 段落。
Q列表和关联数组也可以设置导出属性吗
A是可以的如果你的bash支持它们不过有些问题 **参考链接2** )。
Q为什么我在查看变量或函数导出属性的时候显示的开头是`declare`
A因为`declare`也能够设置变量或函数的导出属性,详见`declare`命令。
### 注意
1. 该命令是bash内建命令相关的帮助信息请查看`help`命令。
### 知识点
`info bash`或 [bash在线文档](http://www.gnu.org/software/bash/manual/bash.html) 的
`3.7.3`节提到了shell执行环境其中涉及变量和函数的内容如下
> - shell parameters that are set by variable assignment or with set or inherited from the shells parent in the environment
> - shell functions defined during execution or inherited from the shells parent in the environment
那么第一句话中的参数又和变量有什么关系呢?在`3.4`节第一段中提到:
> A variable is a parameter denoted by a name.
变量是有名字的参数。
那么子shell确实继承了父shell中带有导出属性的变量或函数。
可参考链接 [执行脚本方式的区别](https://blog.csdn.net/soaringlee_fighting/article/details/78759448)
### 参考链接
1. [关于bashrc profile文件的讨论](https://www.cnblogs.com/hongzg1982/articles/2101792.html)
2. [关于export数组的讨论](https://stackoverflow.com/questions/5564418/exporting-an-array-in-bash-script)
3. [export -pf用法](https://unix.stackexchange.com/questions/22796/can-i-export-functions-in-bash)
4. [环境变量和shell变量的区别](https://askubuntu.com/questions/26318/environment-variable-vs-shell-variable-whats-the-difference)
### 实例
@ -56,4 +198,4 @@ declare -x USER="root"
```
<!-- Linux命令行搜索引擎https://jaywcjlove.github.io/linux-command/ -->
<!-- Linux命令行搜索引擎https://jaywcjlove.github.io/linux-command/ -->