关于子shell, subshell 参考:http://blog.csdn.net/sosodream/article/details/5683515

系统引导时的进程为 "原始进程" id=0, 然后时init 进程, 进程号=1, 后面所有的进程都是它派生出来的. 如果父进程终止导致留下 孤儿 (子进程) 也会被 init所收养.

子进程的创建过程: fork+exec: fork由父进程创建子进程的环境; 然后由exe加载子进程代码并执行.

shell创建子进程有 四种情况: 后台执行时&; 管道执行时 |; 括号执行时(); 执行外部的程序或命令时.

但是shell也提供了(有两个不会创建子进程, 直接在当前shell中执行的命令)就是 source和点号命令.


shell的变量类型: shell变量和shell 环境变量.
区别是: shell变量只能在当前shell中有效, 而不能在 其子进程中(子shell)中有效.
shell环境变量, 可以在当前shell 及其 subshell中 有效.
但是 不管是什么shell变量(包括shell环境变量), 都只是针对当前shell "当前这个 shell 窗口" 有效的. 即使是在shell中定义的 export环境变量, 也不能在 其他 shell 窗口中生效! 也就是说, 所谓的export是针对 "一个shell窗口的" subshell 子进程而言的. 而两个 shell窗口是独立的进程. 当然不能共享.

两个"shell窗口"间不能共享"export变量", source和点号命令不创建subshell

注意: echo $一个变量, 如果有值, 则输出该变量的值, 否则会输出一个空行(包括纯粹的echo命令, 也会输出一个空行)

================

shell脚本什么时候,需要 添加可执行 属性才能执行?

一个原则, 如果直接运行 该脚本文件, 不借助于 外部的命令 来执行, 则需要设置脚本文件的 可执行属性, 否则会提示 permission denied . 因为在脚本中已经指名了 执行该脚本的程序, 就是用bash来执行的.
反之, 如果借助外部命令, 如: bash, .点命令, source 则不需要设置 脚本的executable 属性, 甚至不必 写 #!/bin/bash.

为什么要用 ./foo.sh 来执行脚本
因为, 如果shell 没有扫描到 ./ 就会把它当作 $PATH 中的目录中的命令 去搜索 执行, 就会报错"foo.sh command is not found. " 的错误.

sh脚本异常:/bin/bash^M: bad interpreter: No such file or directory ?

在这里是把 bash^M, 作为一个整体的 shell解释器, 当然是没有这样的解释器了.

为什么会多一个 ^M 呢?
这个是不同系统的换行符不同引起的.windows的换行符一般都是用\r\n 而Linux/Unix一般只用\n 如果在linux下用\n换行的文本, 用记事本打开时会没有换行,而用\r\n结尾的文件再linux的vi中显示时会将\r显示成^M

\r是回车符,\n是换行符
电传打字机(Teletype Model 33)的玩意,每秒钟可以打10个字符, (每个字占0.1秒). 但是它有一个问题,就是打完一行换行的时候,要用去0.2秒,正好可以打两个字符。要是在这0.2秒里面,又有新的字符传过来,那么这个字符将丢失。
于是,研制人员想了个办法解决这个问题,就是在每行后面加两个表示结束的字符。一个叫做“回车”,告诉打字机把 打印头 定位在左边界;另一个叫做“换行”,告诉打字机把纸向下移一行。
这就是“换行”和“回车”的来历, \r: return 回车; \n newline 新行, 换行
后来,计算机发明了,这两个概念也就被般到了计算机上。那时,存储器很贵,一些科学家认为在每行结尾加两个字符太浪费了,加一个就可以。 于是,就出现了分歧。Unix 系统里,每行结尾只有“ ”,即“\n”; Mac系统里,每行结尾是“”, 即 "\r", Windows系统里面,每行结尾是“”,即“ \r\n”;。一个直接后果是,Unix/Mac系统下的文件在Windows里打开的话,所有文字会变成一行: 因为没有回车; 而Windows里的文件在Unix/Mac下打开的话,在每行的结尾可能会多出一个^M符号: 其中的\r 变成^M, 而\n就成为 unix的换行了.

解决方法, 就是, 在vi中, 查看文件格式, set fileformat; 或, set ff=file format. 在windows中创建的就是 ff=dos, 只要重新设置一下, set ff=unix就可以了.


linux 子shell subshell和函数的更多相关文章

  1. Linux centosVMware shell中的函数、shell中的数组、

    一.shell中的函数 函数就是把一段代码整理到了一个小单元中,并给这个小单元起一个名字,当用到这段代码时直接调用这个小单元的名字即可. 格式: function _name() { command ...

  2. Linux - 简明Shell编程08 - 函数(Function)

    脚本地址 https://github.com/anliven/L-Shell/tree/master/Shell-Basics 示例脚本及注释 #!/bin/bash function Check( ...

  3. 进入子shell的各种情况分析

    子shell的概念贯穿整个shell,写shell脚本时更是不可不知.所谓子shell,即从当前shell环境新开一个shell环境,这个新开的shell环境就称为子shell(subshell),而 ...

  4. 子shell以及什么时候进入子shell

    bash&shell系列文章:http://www.cnblogs.com/f-ck-need-u/p/7048359.html 子shell的概念贯穿整个shell,写shell脚本时更是不 ...

  5. Linux Shell编程(27)——子shell

    运行一个shell脚本时会启动另一个命令解释器. 就好像你的命令是在命令行提示下被解释的一样, 类似于批处理文件里的一系列命令.每个shell脚本有效地运行在父shell(parent shell)的 ...

  6. Linux中shell和子shell一点点理解

    Linux执行脚本有两种方式,主要区别在于是否建立子shell   1.像sh,bash,./命令是用来执行shell脚本的,在bash/sh命令下,脚本文件可以无"执行权限",即 ...

  7. Linux基础-shell脚本知识整理和脚本编写----------变量、运算符、流程控制、函数、计划任务(发送邮件)

    I:知识整理:变量.运算符.流程控制.函数.计划任务 变量 系统变量:set:显示所有变量                env:环境变量 常用系统变量: path pwd lang home his ...

  8. Linux Shell脚本编程-函数

    函数介绍  定义:把一段独立功能的的代码当做一个整体,并为之一个名字,命名的代码段,此即为函数:  功能:函数function是由若干条shell命令组成的语句块,实现代码重用和模块化编程.  注意: ...

  9. Linux编程 9 (shell类型,shell父子关系,子shell用法)

    一. shell类型 1.1  交互式 bin/ shell程序 当用户登录到某个虚拟控制台终端或是在GUI中启动终端仿真器时,默认的shell程序就会开始运行.系统启动什么样的shell程序取决于你 ...

随机推荐

  1. Beta冲刺1.0

    1. 提供当天站立式会议照片一张 2. 每个人的工作 (有work item 的ID) 3. 发布项目燃尽图 4. 每人的代码/文档签入记录 (1)代码签入记录 (2)代码签入链接   链接1   链 ...

  2. mysql 知识

    1.  数据库事务的四个特性及含义 数据库事务transanction正确执行的四个基本要素.ACID,原子性(Atomicity).一致性(Correspondence).隔离性(Isolation ...

  3. web.config 特殊字符转义

    字符 转义码 & 符号 & & 单引号 ' &apos; 双引号 " " 大于 > > 小于 < <

  4. 转:php 5.5源码安装全过程

    下载 PHP 源码包 # wget http://cn2.php.net/distributions/php-5.5.15.tar.bz2 # tar xf php-5.5.15.tar.bz2 -C ...

  5. mysql分区/分片

    一.分区概念 mysql 5.1 以后支持分区, 有点类似MongoDB中的分片概念. 就是按照一定的规则, 将一个数据库表分解成很多细小的表, 这些细小的表可以是物理的分区, 就是在不同的位置. 但 ...

  6. 使用Groovy+Spock构建可配置的订单搜索接口测试用例集

    概述 测试是软件成功上线的安全网.基本的测试包含单元测试.接口测试.在 "使用Groovy+Spock轻松写出更简洁的单测" 一文中已经讨论了使用GroovySpock编写简洁的单 ...

  7. MyBatis学习(一)简单入门程序

    MyBatis入门学习 MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名 ...

  8. 转:C#判断ContextMenuStrip右键菜单的来源(从哪个控件弹出来的)

    转载自:http://hi.baidu.com/cookiemulan/item/82df8ff867dd53cc531c26c7 有时候,为了提高性能和节约资源,我们会为多个控件,指定同一个右键弹出 ...

  9. python GIL 全局锁,多核cpu下的多线程性能究竟如何?

    python GIL 全局锁,多核cpu下的多线程性能究竟如何?GIL全称Global Interpreter Lock GIL是什么? 首先需要明确的一点是GIL并不是Python的特性,它是在实现 ...

  10. Wi-Fi Mesh网络技术

    Wi-Fi在很早的时候就引入了mesh技术,并且最近得到了越来越多的关注.谷歌.Eero.Linksys.Netgear以及几乎所有以家庭和小型办公室为目标的网络品牌都提供了mesh网格系统.但是也有 ...