理解shell(第五章)

1. shell的类型
 [[email protected] ~]# ls -l /bin/*sh
 -rwxr-xr-x. 1 root root 938832 Jul 18  2013 /bin/bash
 lrwxrwxrwx. 1 root root      4 Oct 27  2014 /bin/csh -> tcsh
 -rwxr-xr-x. 1 root root 109672 Oct 17  2012 /bin/dash
 lrwxrwxrwx. 1 root root      4 Oct 27  2014 /bin/sh -> bash
 -rwxr-xr-x. 1 root root 387328 Feb 22  2013 /bin/tcsh
 在centos6中运行上述命名可看到在centos中shell有bash、csh、dash。centos中终端默认启动是一般为bash。
    在命令行模式输入bash命令,会生成一个子shell,使用exit命令退出子shell

2. shell的父子关系
 shell进程是存在父子关系的,父shell可以通过bash命令创建子shell、子shell还可以通过bash命令再次创建子shell,通过ps -f命令可以看到父子shell进程之间的关系,通过ps --forest 可以查看父子shell之间的 层级关系。当运行一个shell命令时,sehll会创建一个子来执行改命令

3. 进程列表
 当我们想一次运行多个命令时可以在命令与命令之间加上(;)这样就shell就会依次执行这些命令。如下:
 [[email protected] ~]# pwd;ls;cd /etc
 /root
 anaconda-ks.cfg  Documents  install.log.syslog  Pictures  Templates
 Desktop          Downloads  Music               Public    Videos
 [[email protected] etc]#
 
 但上述并不是进程列表,将上述命令加到一个()里,这样就shell仅会生成一个子shell来执行这些命令,如下:
 [[email protected] ~]# (pwd;ls;cd /etc;pwd)
 /root
 anaconda-ks.cfg  Documents  install.log.syslog  Pictures  Templates
 Desktop          Downloads  Music               Public    Videos
 /etc
 
 还有一种创建进程列表的方法,它不会创建子shell进程,将命令放置于{}中,{}内首尾用空格隔开,命令后务必加(;),如下:
 [[email protected] ~]# { pwd;ls;cd /etc;pwd; }
 /root
 anaconda-ks.cfg  Documents  install.log.syslog  Pictures  Templates
 Desktop          Downloads  Music               Public    Videos
 /etc
 
 要知道是否生成了子进程可以使用$BASH_SUBSHELL环境变量的值来查看,为0时表示没有生成子进程,为1时表示生成了子进程
 [[email protected] ~]# (pwd;ls;cd /etc;echo $BASH_SUBSHELL)
 /root
 anaconda-ks.cfg  Documents  install.log.syslog  Pictures  Templates
 Desktop          Downloads  Music               Public    Videos
 1
 
 [[email protected] ~]# { pwd;ls;cd /etc;echo $BASH_SUBSHELL; }
 /root
 anaconda-ks.cfg  Documents  install.log.syslog  Pictures  Templates
 Desktop          Downloads  Music               Public    Videos
 0
 
 使用子进程的开销比较大,因为终端控制着子进程的I/O
 
4. 后台模式
 用终端启动的进程一般会在前台运行,通过下列方式可以将命令切至后台运行
 COMMADN & :在命令后在&,可以将命令运行至后台
 CTRL+Z:在命令运行时执行此操作可以将命令转到后台运行
 
 上述方法虽然将命令送至后台运行但是依然与终端相关,如果需要剥离与终端的联系,应使用如下方式:
 nohub COMMAND &
 
 日常使用中可以使用后台模式,让命令执行时不受制于终端I/O,提高效率,例如进行文件归档时:
 $ (tar -cf Rich.tar /home/rich ; tar -cf My.tar /home/christine)&
 [3] 2423
 
 可以通过jobs命令来查看当前运行在后台的进程,或jobs -l来查看更详细的信息,一旦任务完成则会看到Done的提示
 还可以通过如下方式来控制作业
 fg [[%] JOB_NUM]:把指定的后台作业调回前台;
 bg [[%] JOB_NUM]:让送回后台的作业继续运行;
 kill [[%] JOB_NUM]:终止指定作业
 
 可以用一个有意思的命令来查看后台作业:
 sleep # & :让进程睡眠#秒,此时可以使用jobs命令查看后台作业
 
 协程命令coproc,它可以让命令运行于后台,可以创建一个子shell,然后在子shell中运行指定的命令,例如:
 [[email protected] etc]# coproc { sleep 10; }
 [1] 24343
 [[email protected] etc]# jobs -l
 [1]+ 24343 Running                 coproc COPROC { sleep 10; } &
 
5. 外部命令和内建命令
 可以通过type命令来区别外部命令和内建命令:
 [[email protected] etc]# type cd
 cd is a shell builtin
 [[email protected] etc]# type htop
 htop is /usr/bin/htop
 由上可以看出cd是一个内建命令,htop是一个外部命令,可以通过type -a来查看更详细的信息,通过which命令来看到命令所在的路径。
 
 有的命令存在外部和内建两种方式,例如pwd:
 [[email protected] etc]# type -a pwd
 pwd is a shell builtin
 pwd is /bin/pwd
 [[email protected] etc]# which pwd
 /bin/pwd
 
 内建命令在运行时不会创建子进程来运行,比外部命令效率高。
 
 常用的内建命令有:
  history:用于管理命令历史,当登录shell时,会读取命令历史文件中的记录,~/.bash_history,当退出shell会将登录shell后执行的命令追加至命令历史文件中。
  参数:
   -a:将当前shell中执行的命令追加到~/.bash_history中
   -d #:删除指定编号的命令历史中的命令
   -c:清空命令历史
  快捷操作:
   !!:调用上一条命令
   !#:调用命令历史中第#条命令
   ! string:调用命令历史中最近一个以string开头的命令
  
  alias/unalias:命令别名管理 
   alias 别名=命令名(如果包含空格需要在命令名外加引号):创建别名
   unalias 别名
   使用命令修改只能当前shell有效,如果要永久有小,需要修改~/.bashrc文件。

时间: 2024-10-04 11:49:09

理解shell(第五章)的相关文章

深入理解Magento – 第五章 – Magento资源配置(转)

第五章 – Magento资源配置 对于任何一个更新频繁的项目来说,保持开发环境和生产环境的数据库同步是件很头疼的事情.Magento提供了一套系统,用版本化的资源迁移脚本来 解决这个问题. 上一章,我们为 Helloworld Blogpost 创建了一个模型.我们直接通过SQL语句“CREATE TABLE”来创建数据表.在这一章,我们将为Helloworld模块创建一个资源配置(Setup Resource)用于创建数据表.我们也会创建一个模块升级脚本,用来升级已经安装的模块.下面是我们要

第五章 shell学习之文件的排序、合并和分割

sort命令 sort [选项] [输入文件] 选项: -c 测试文件是否已经排序,如果未被排序则输出第一个未被排序的记录 -k 指定排序的域 -m 合并两个已排序的文件,合并的文件也已经排序,如sort -m a1 a2,a1的记录被有序的插入a2 -n 根据数字的大小进行排序,一般放在域号后,如-k3n -o 将输出重定向到指定文件 -r 将排序结果逆向显示 -t 改变域分割符,如-t: -u 去除结果中的重复行 sort和awk联合 例: [[email protected] tmp]#

提供跟老男孩学Linux运维Shell编程实战的第四、第五章源代码

第四章是讲Shell变量知识进阶与实践: 第五章是讲变量的数值计算实践: 附件中包括源码,请下载. 该两章在学习时要注意相关事项: 1.注意标点符号的使用:例如,单引号,反引号,双引号等: 2.注意该要留空格的留空格: 3.注意特殊变量的作用: 4.内置变量的使用: 5.算术运算任的使用.

第五章 shell函数的定义、执行、传参和递归函数

第五章 shell函数的定义.执行.传参和递归函数 Bash(Bourne Again shell)也支持函数,在编写大型复杂脚本的时候,可以用函数把代码编写成一个一个功能相对独立的代码块,使代码模块块.结构清晰.有效的减少程序的代码量.但是bash shell是一种解释性语言,执行效率没有编译性语言高. shell函数的定义 格式一:( function name() { command sequence (命令序列) } 格式二: name() { command sequence (命令序

第十五章 shell正则表达式

第十五章 shell正则表达式 见图片 Shell正则表达式 正则表达式的分类 基本的正则表达式(Basic Regular Expression 又叫Basic RegEx 简称BREs) 扩展的正则表达式(Extended Regular Expression 又叫Extended RegEx 简称EREs) Perl的正则表达式(Perl Regular Expression 又叫Perl RegEx 简称PREs) 基本组成部分 正则表达式的基本组成部分. 正则表达式 描述 示例 Bas

[深入理解Android卷一全文-第五章]深入理解常见类

由于<深入理解Android 卷一>和<深入理解Android卷二>不再出版,而知识的传播不应该因为纸质媒介的问题而中断,所以我将在OSC博客中全文转发这两本书的全部内容. 第5章 深入理解常见类 本章主要内容 ·  分析RefBase.sp,wp和LightRefBase类. ·  分析Native的Thread类和常用同步类. ·  分析Java层的Handler.Looper,以及HandlerThread类. 本章涉及的源代码文件名称及位置 下面是我们本章分析的源码文件名和

《大道至简》第五章读后感

失败的过程也是过程,我觉得这句话很有深意,阅读完大道至简第五章,我又有了很深的感触. 首先是“做过程不是做工程”,过程是为了实现某种目的而经历的一些事情,过程有很多种,虽然经历了某种过程,但不一定能实现某种功能.做完过程的每一个阶段,并不等于做工程.做过程不是做工程的精义,也不是最终目的. 然后是“做过场”,做过场就好像是一种形式一样,做了没必要做的事情,就是浪费时间. 做工程的最终目的是实现客户的要求,工程只是一种实现的途径.最初做开发的前辈们,不用什么工程或者过程,也一样编出了程序,也一样解

深入浅出Zabbix 3.0 -- 第十五章 Zabbix 协议与API

今天是六.一儿童节,祝小朋友们节日快乐!发完此文就带我家小朋友出去玩耍了. 第十五章 Zabbix 协议与API 本章将介绍和开发相关的Zabbix协议和API的内容,通过对Zabbix协议和API的深入了解,你可以利用Zabbix协议编写客户端程序并将其嵌入的产品或系统中,并将数据发送到Zabbix server,这在无法安装Zabbixagent等程序的场景(例如专用的嵌入式系统)中非常有用.你也可以利用Zabbix API开发自己的业务系统,或灵活的与现有系统整合集成. 15.1 Zabb

大道至简 第五章 失败的过程也是过程 读后感

今天该写一写大道至简第五章读后感了. 首先是“做过程不是做工程”,过程是为了实现某种目的而经历的一些事情,过程有很多种,虽然经历了某种过程,但不一定能实现某种功能.做完过程的每一个阶段,并不等于做工程.做过程不是做工程的精义,也不是最终目的. 然后是“做过场”,做过场就好像是一种形式一样,做了没必要做的事情,就是浪费时间. 我们为什么做工程,不要忘了最终目的.目的,是实现客户的要求,工程只是一种实现的途径.最初做开发的前辈们,不用什么工程或者过程,也一样编出了程序,也一样解决了问题,也一样实现了

现代编译原理--第五章(活动记录)

(转载请表明出处  http://www.cnblogs.com/BlackWalnut/p/4559245.html ) 第五章是到目前位置最让我头疼的一章,不是因为难,是因为对最终的目的不太明确.整章前半部分用十分精简的语言介绍了一个新的概念,活动记录,也就是在函数调用时,一个调用栈究竟发生了什么事.但是,在最终编码实现过程中,总不能理解作者为什么给了这些变量?或者说,完全不知道作者究竟想让我完成一个怎样的功能.纠结了好几天,后来索性往后继续看,看看能不能找到其他的线索.直到看完后一章,硬着