关于子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. 强化学习--Policy Gradient

    Policy Gradient综述: Policy Gradient,通过学习当前环境,直接给出要输出的动作的概率值.   Policy Gradient  不是单步更新,只能等玩完一个epoch,再 ...

  2. php aes128加密

    //[加密数据]AES 128 ECB模式 public function aesEncrypt($str){ $screct_key = Yii::$app->params['encryptK ...

  3. poj2417 Baby-StepGiant-StepAlgorithm a^x=b%P

    #include <iostream> #include <algorithm> #include <string.h> #include <cstdio&g ...

  4. xpath ,css

    https://docs.scrapy.org/en/latest/intro/tutorial.html xpath @选择属性  .当前目录下选择 //任意路径选择 /bookstore/book ...

  5. mysql 查看版本和是否支持分区

    命令行界面: 查看版本: select version(); 结果: +------------+| version() |+------------+| 5.6.31-log |+--------- ...

  6. pyspider 示例

    数据存放目录: C:\Users\Administrator\data 升级版(可加载文章内所有多层嵌套的图片标签) #!/usr/bin/env python # -*- encoding: utf ...

  7. 设计模式之Builder(建造者)(转)

    Builder模式定义: 将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示. Builder模式是一步一步创建一个复杂的对象,它允许用户可以只通过指定复杂对象的类型和内容就可以 ...

  8. 按渠道计算 PV 和 UV

    按渠道计算 PV 和 UV: ------------------按指定channel_id按月求PV.UV------------ drop table if exists tmp_pvuv; cr ...

  9. C# 制作软件启动界面

    制作一个软件的启动界面 1.新建一个工程,将默认生成界面作为启动界面. 2.添加一个Label和ProgressBar还有Timer控件 注意:在ProgressBar控件中需要设置它的style  ...

  10. 第三方统计分析埋点工具对比,神策、Ptmind、GrowingIO、国双,还有谷歌分析,谁更好?

    第三方统计分析埋点工具对比,神策.Ptmind.GrowingIO.国双,还有谷歌分析,谁更好?https://www.colabug.com/2985393.html GA.Mixpanel 和神策 ...