Linux(基于《Linux命令行与shell脚本编程大全》学习笔记)5认识shellshell类型系统启动什么样的shell程序取决于你个人的用户名配置,在/etc/passwd文件,默认shell列在用户ID记录的第七个字段中。只要用户登录,默认的shell就开始运行root:x:0:0:root:/root:/bin/bash上面是一段passwd。在上面的例子中,GUNbashshell作为其默认的shell程序,还有几个不太常用的shell是tcsh,dash,csh(有的可能已经消失了,不同版本不一样)Ubuntu系统默认使用dashshell,这些shell程序可以设置为用户的默认shell。由于bashshell应用广泛,一般使用bash查看系统默认的shell,命令如下:ls-l/usr/bin/sh也可以使用/usr/bin/dash直接启动dashshell父子关系的shell(如果存在dash)每次用户登录时,都会根据passwd中指定的shell类型启动一个shell程序。例如,如果我现在使用的是bashshell,它会启动,然后输入等效的bash命令来创建一个新的shell程序。这个程序叫做子shell。执行两次bash命令后,用ps-f查看如下:第二列bash的ppid是第一个pid,第三个ppid是第二个pid,我们再次执行ps命令其实就是UIDPIDPPIDCSTIMETTYTIMECMDroot2669526692016:42pts/100:00:00-bashroot2919826695017:05pts/100:00:00在第三个子bash中执行bashroot2922629198017:05pts/100:00:00bashroot2924629226017:05pts/100:00:00ps-f这个不够直观,再用ps中的GUNlong参数:ps--forestPIDTTYTIMECMD26695pts/100:00:00bash29198pts/100:00:00--\_bash29226pts/100:00:00----\_bash30893pts/100:00:00------\_ps这次可以看出他们之间的父子关系了。您可以使用exit退出子shell进程列表。您可以在一行中用分号';'分隔需要顺序执行的命令pwd;ls;cd/etc;ll以上例子中的所有命令都是按顺序执行的,但这不是一个进程列表。如果命令列表要变成进程列表,命令必须用括号括起来(pwd;ls;cd/etc;ll)所谓进程列表就是创建一个子shell来执行进程列表。我们通过戒指环境变量命令echo$BASH_SUBSHELL检查是否有子shell并返回子shell个数当我们执行一个命令listpwd;ls;cd/etc;ll;echo$BASH_SUBSHELL可以看到末尾显示的个数命令为0,表示没有创建子shell执行一个进程列表(pwd;ls;cd/etc;ll;echo$BASH_SUBSHELL)(pwd;ls;cd/etc;ll;(echo$BASH_SUBSHELL))结果第一个进程列表的是1,第二个是2,注意括号的数量。后台模式睡眠命令sleep[second],sleep10表示暂停十秒。sleep1000&表示将睡眠命令置于后台。执行后会出现两条消息,第一条是方括号中后台作业的作业号,第二条是后台作业的进程id。在睡眠定时器超时之前,可以使用jobs命令查看后台模式下运行的进程jobs-l一般来说,子shell的作用是在不影响当前中端操作的情况下,进行繁重的处理工作。常见的应用场景是neutronshell的另一种用法,用于解压、编译、打包等操作---协程coproc可以同时做两件事,它可以生成一个Subshel??l,执行命令coprocsleep10在这个子shell中执行上面的命令,使用jobs查看子shell进程,可以看到[1]+RunningcoprocCOPROCsleep10&上面的例子在后台可以看到执行子shell中执行的命令是coprocCOPROCsleep10&COPROC是协程命令默认给进程的名字,我们也可以指定名字coprocMy_Job{sleep10;}注意上面命令的格式,如果使用扩展名,必须保证命令以;结尾;最后,命令和两边的花括号之间有一个空格。如果使用多个协程,需要给协程命名,否则名字会冲突。以下是我尝试创建第二个协程时的警告。coproc[24257:COPROC]仍然存在也可以使用协程和上面的进程列表来生成嵌套的子shellcoproc(sleep10;sleep2;)但是尽量不要使用嵌套,性能很差!外部命令外部命令,也称为文件系统命令,是存在于bashshell之外的程序。它们不是shell程序的一部分。外部命令程序位于/bin和/sbin。ps是一个外部命令。您可以使用which或tupe命令来查找它。whichps/usr/bin/pstype-apspsis/usr/bin/ps当执行外部命令时,会创建一个子进程。这个子进程的父进程就是当前的bashshell内置命令。对于内置命令typecd;typetypecdisashellbuiltintypeisashellbuiltin有些命令有多种实现,使用type-a查看命令历史命令的不同实现历史命令可以查看最近使用的列表命令,默认保存1000条最近的使用记录。如果要修改最大记录数,可以修改名为HISTSIZE的环境变量。命令历史记录保存在隐藏文件.bash_history中。该文件位于用户的主目录中。bash历史命令首先保存在内存中,并在shell退出后写入。如果需要强制写入,可以使用history-a命令。当有多个bash客户端时,其他客户端的命令历史不会通过history-a命令写入,需要另外写一个命令历史。-n。我们知道执行!!可以执行最后一条命令,所以!20就是执行历史记录中的第20条记录。alias命令可以为常用命令(和参数)创建另一个名称。比如大家熟知的ls命令就是内置的别名命令alias-p可以查看当前可用的aliasaliascp='cp-i'aliasegrep='egrep--color=auto'aliasfgrep='fgrep--color=auto'别名grep='grep--color=auto'别名l.='ls-d.*--color=auto'别名ll='ls-l--color=auto'别名ls='ls--color=auto'aliasmv='mv-i'aliasrm='rm-i'以aliasli='ls-li'的格式定义别名
