关于子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. oracle中实现md5加密

    记得要实现md5加密,在oracle 11g 和 12c中是有不同的方式的,在12c中较为简单,记得直接有预定义的函数. 但是在11g中要实现就需要自己进行一些额外的处理,以下给出一个md5函数的实现 ...

  2. N-城堡问题

    1 2 3 4 5 6 7 ############################# 1 # | # | # | | # #####---#####---#---#####---# 2 # # | ...

  3. C# 调用.bat 提示该命令不是内部命令或外部命令

    前提:双击.bat文件可以执行成功,用C#调用提示该命令不是内部命令或外部命令...... 解决方法:下面代码的红色标注,既要设置.bat文件的文件名FileName,也要设置.bat文件所在的文件夹 ...

  4. Mysql常规优化

    一.SQL语句优化 (1)使用limit对查询结果的记录进行限定(2)避免select *,将需要查找的字段列出来(3)使用连接(join)来代替子查询(4)拆分大的delete或insert语句 二 ...

  5. 【转】C#中base关键字的几种用法

    base其实最大的使用地方在面相对性开发的多态性上,base可以完成创建派生类实例时调用其基类构造函数或者调用基类上已被其他方法重写的方法.例如: 2.1关于base调用基类构造函数 public c ...

  6. linux基础操作

    1.pwd 2.clear 3.who 4.cal 5.uname 6.wc 7.man在线帮助命令 8.--help.info.whatis 9.使用su命令以root身份进入linux 10.Sh ...

  7. Game (思维)

    #include<bits/stdc++.h> using namespace std; ; char str[maxn][maxn]; int cntx[maxn], cnty[maxn ...

  8. Lua 服务器Socket通信实例

    local socket = require"socket" local host = "127.0.0.1"local port = "843&qu ...

  9. go语言,golang学习笔记4 用beego跑一个web应用

    go语言,golang学习笔记4 用beego跑一个web应用 首页 - beego: 简约 & 强大并存的 Go 应用框架https://beego.me/ 更新的命令是加个 -u 参数,g ...

  10. Django后端项目---- rest framework(4)

    一.分页 试问如果当数据量特别大的时候,你是怎么解决分页的? 方式a.记录当前访问页数的数据id 方式b.最多显示120页等 方式c.只显示上一页,下一页,不让选择页码,对页码进行加密 1.基于lim ...