linux 子shell subshell和函数
关于子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和函数的更多相关文章
- Linux centosVMware shell中的函数、shell中的数组、
一.shell中的函数 函数就是把一段代码整理到了一个小单元中,并给这个小单元起一个名字,当用到这段代码时直接调用这个小单元的名字即可. 格式: function _name() { command ...
- Linux - 简明Shell编程08 - 函数(Function)
脚本地址 https://github.com/anliven/L-Shell/tree/master/Shell-Basics 示例脚本及注释 #!/bin/bash function Check( ...
- 进入子shell的各种情况分析
子shell的概念贯穿整个shell,写shell脚本时更是不可不知.所谓子shell,即从当前shell环境新开一个shell环境,这个新开的shell环境就称为子shell(subshell),而 ...
- 子shell以及什么时候进入子shell
bash&shell系列文章:http://www.cnblogs.com/f-ck-need-u/p/7048359.html 子shell的概念贯穿整个shell,写shell脚本时更是不 ...
- Linux Shell编程(27)——子shell
运行一个shell脚本时会启动另一个命令解释器. 就好像你的命令是在命令行提示下被解释的一样, 类似于批处理文件里的一系列命令.每个shell脚本有效地运行在父shell(parent shell)的 ...
- Linux中shell和子shell一点点理解
Linux执行脚本有两种方式,主要区别在于是否建立子shell 1.像sh,bash,./命令是用来执行shell脚本的,在bash/sh命令下,脚本文件可以无"执行权限",即 ...
- Linux基础-shell脚本知识整理和脚本编写----------变量、运算符、流程控制、函数、计划任务(发送邮件)
I:知识整理:变量.运算符.流程控制.函数.计划任务 变量 系统变量:set:显示所有变量 env:环境变量 常用系统变量: path pwd lang home his ...
- Linux Shell脚本编程-函数
函数介绍 定义:把一段独立功能的的代码当做一个整体,并为之一个名字,命名的代码段,此即为函数: 功能:函数function是由若干条shell命令组成的语句块,实现代码重用和模块化编程. 注意: ...
- Linux编程 9 (shell类型,shell父子关系,子shell用法)
一. shell类型 1.1 交互式 bin/ shell程序 当用户登录到某个虚拟控制台终端或是在GUI中启动终端仿真器时,默认的shell程序就会开始运行.系统启动什么样的shell程序取决于你 ...
随机推荐
- Service Fabric本地开发部署修改数据目录
以修改5节点非安全模式为例: 在C:\Program Files\Microsoft SDKs\Service Fabric\ClusterSetup\NonSecure\FiveNode目录下,修改 ...
- java基础练习2
1, 写一段代码, 可以取出任意qq邮箱地址中的qq号码 public class Test { public static void main(String[] args) { String str ...
- python ---多线程thread
thread 在数据预处理的时候用处不大,因为有GIL 锁 查看thread信息 import threading print(threading.current_thread()) print(th ...
- wordpress学习(五)----插件
wordpress加载顺序:首先加载插件,再加载主题中的functions.php,初始化一些数据之类的,最后加载模板了!!! update_option("hc_copyright_tex ...
- 关于django编码问题所导致的502错误
在使用django开发的时候,访问网站出现了502错误,次数也比较平繁 uwsgi+nginx+django 在命令行下提示如下错误 : File "/opt/apps/python3/li ...
- for-each 循环原理
for-each 循环原理1,for-each 是在java5 之后出现的.for是java 上的一个关键字,在jdk 找不到任何for的底层实现的.是因为for的底层实现被封装到了编译器中.所以通过 ...
- python 内置函数format
Python2.6 开始,新增了一种格式化字符串的函数 str.format(),它增强了字符串格式化的功能. 基本语法是通过 {} 和 : 来代替以前的 % . format 函数可以接受不限个参数 ...
- 转:【专题五】TCP编程
前言 前面专题的例子都是基于应用层上的HTTP协议的介绍, 现在本专题来介绍下传输层协议——TCP协议,主要介绍下TCP协议的工作过程和基于TCP协议的一个简单的通信程序,下面就开始本专题的正文了. ...
- tomcat tomcat-user.xml被还原
问题:把tomcat——conf中的tomcat-user.xml中的角色.密码修改之后,在eclipse重启Tomcat,设置的Tomcat用户名和密码失效. 解决问题:同时修改tomcat——co ...
- 环绕声5.1ch
简单说5.1ch就是数字影院中的音频输出术语,环绕立体声输出,让人有置身电影院的感觉,由五个音箱(两个主音箱.两个环绕箱.一个中置箱)+一个低音炮组成 5.1环绕声包括了5个全频带声道和 1个低频效果 ...