shell中export理解误区

  一直以来,以为shell脚本中经过export后的变量会影响到执行这个shell的终端中的环境变量。环境变量这个概念不是shell所独有的,而是linux里面进程所拥有的,shell解释器运行起来就是一个进程,这样它也就有了自己的环境变量。通常linux下main函数写法有:

1 int main(void)
2 int main(int argc, char **argv)
3 int main(int argc, char **argv, char **envp)

  常见的为前2种写法,第三种最后的envp就是一个指向环境变量表的二级指针。在shell下执行一个程序,这个程序是由shell fork一个子进程来exec它的,即这个程序是执行它的shell的子进程。又知道linux子进程和父进程共享代码段,但是数据段,堆栈是独自拥有的,但是子进程在被创建时会继承父进程的数据段原来的内容,环境变量也包括在内,这样一来,由shell启动的这个程序的envp就和shell的环境变量内容一样了。如果这个时候执行另一个shell脚本,它里面export变量也就是相当于修改它自己的环境变量表,由于父子进程环境变量是独立的,所以当它执行完毕,执行它的这个shell也就是它的父进程的环境变量显然是不会受影响的。

时间: 2024-12-25 22:22:40

shell中export理解误区的相关文章

畅销书对Java中Iterator的理解误区

声明:本博客为原创博客,未经允许,不得转载!原文链接为http://blog.csdn.net/bettarwang/article/details/28110615 最近放假,闲来无事,便翻看以前看过的一些书,竟然发现有些书本(甚至是一些畅销书)对Java中Iterator有很大的误解,比如某畅销书在Collection那一章有这么一句话:"当使用Iterator对集合元素进行迭代时,Iterator并不是把集合元素本身传给了迭代变量,而是把集合元素的值传给了迭代变量,所以修改迭代变量的值对集

理解 Linux shell 中的一个方言:2>&1

理解 Linux shell 中的一个方言:2>&1 2016-11-14 杜亦舒 前言 在使用 linux 命令或者 shell 编程时,这个用法常会遇到 2>&1 如果是刚开始接触Linux,这个东西的确不好理解,因为他没有直观的含义,不像一个命令,例如 cp是 copy 的简写,很好记. 我以前刚用Linux时就对这个东西迷糊了一段时间,今天刚好看到一篇文章介绍他,感觉很有必要总结出来,分享给还不是很理解这个方言的朋友. 下面看一个命令示例,然后分析下他是如何工作的: l

shell中的环境变量:local,global,export

 1.local一般用于局部变量声明,多在在函数内部使用.实例如下:      echo_start() { local STR="$1" echo "...... ${STR} ......starting at $(date)" } 2.Shell脚本中定义的变量是global的,其作用域从被定义的地方开始,到shell结束或被显示删除的地方为止. 3.export 将自定义变量设定为系统环境变量(仅限于该次登陆操作,当前shell中有效)    语法:expo

[Z] shell中的点命令与source命令

1 shell脚本执行方法 有两种方法执行shell scripts,一种是新产生一个shell,然后执行相应的shell scripts:一种是在当前shell下执行,不再启用其他shell. 新产生一个shell然后再执行scripts的方法是在scripts文件开头加入语句:#!/bin/sh.一般的script文件(.sh)即是这种用法.这种方法先启用新的sub-shell(新的子进程),然后在其下执行命令. 另外一种方法就是上面说过的source命令,不再产生新的shell,而在当前s

shell中的点命令与source命令的区别

1 shell脚本执行方法 有两种方法执行shell scripts,一种是新产生一个shell,然后执行相应的shell scripts:一种是在当前shell下执行,不再启用其他shell. 新产生一个shell然后再执行scripts的方法是在scripts文件开头加入语句:#!/bin/sh.一般的script文件(.sh)即是这种用法.这种方法先启用新的sub-shell(新的子进程),然后在其下执行命令. 另外一种方法就是上面说过的source命令,不再产生新的shell,而在当前s

shell中eval的使用问题

转载:http://www.blogjava.net/jasmine214--love/archive/2010/11/26/339106.html 本文将会讲解一些linux中命令的使用与技巧希望对新手给予帮助 一 eval命令将会首先扫描命令行进行所有的置换,然后再执行该命令.该命令适用于那些一次扫描无法实现其功能的变量.该命令对变量进行两次扫描.这些需要进行两次扫描的变量有时被称为复杂变量.不过这些变量本身并不复杂. 1 eval命令也可以用于回显简单变量,不一定是复杂变量 [[email

[ SHELL编程 ] shell中各种括号的使用方法

转载自:http://www.jb51.net/article/60326.htm 在这里我想说的是几种shell里的小括号,大括号结构和有括号的变量,命令的用法,如下:1.${var} 2.$(cmd) 3.()和{} 4.${var:-string},${var:+string},${var:=string},${var:?string} 5.$((exp)) 6.$(var%pattern),$(var%%pattern),$(var#pattern),$(var##pattern)现在分

shell中$(( )) 与 $( ) 还有${ }的区别

http://blog.chinaunix.net/uid-14351756-id-2820651.html $( ) 与 ` ` (反引号)在 bash shell 中,$( ) 与 ` ` (反引号) 都是用来做命令替换用(command substitution)的. 所谓的命令替换与我们第五章学过的变量替换差不多,都是用来重组命令行:* 完成引号里的命令行,然后将其结果替换出来,再重组命令行.例如:[code]$ echo the last sunday is $(date -d "la

Linux shell中的I/O重定向相关(转)

1. 基本概念(这是理解后面的知识的前提,请务必理解)  a. I/O重定向通常与 FD有关,shell的FD通常为10个,即 0-9: b. 常用FD有3个,为0(stdin,标准输入).1(stdout,标准输出).2(stderr,标准错误输出),默认与keyboard.monitor.monitor有关: c. 用 < 来改变读进的数据信道(stdin),使之从指定的档案读进: d. 用 > 来改变送出的数据信道(stdout, stderr),使之输出到指定的档案: e. 0 是 &