Shell:对于Linux来说一种应用程序,在库调用和系统调用之上可以保护操作系统。
shell分为两类:
图形界面shell(GUIshell,Graphical User Interface shell)
命令行界面shell(CLIshell,Command Line Interface shell)
**********************************************************************************
shell发展:
Bourne Shell
首个重要的标准Unix Shell是1970年底在V7 Unix(AT&T第7版)中引入的,并且以它的创始科技部基础条件平台“国家气象网络计算应用节点建设”(2004DKA50730)资助者Stephen Bourne的名字命名。Bourne shell 是一个交换式的命令解释器和命令编程语言。Bourne shell 可以运行为login shell或者login shell的子shell(subshell)。只有login命令可以调用Bourne shell作为一个login shell。此时,shell先读取/etc/profile文件和$HOME/.profile文件。/etc/profile文件为所有的用户定制环境,$HOME/.profile文件为本用户定制环境。最后,shell会等待读取你的输入。
C Shell
Bill Joy于20世纪80年代早期,在Berkeley的加利福尼亚大学开发了C shell。它主要是为了让用户更容易的使用交互式功能,并把ALGOL风格的语法结构变成了C语言风格。它新增了命令历史、别名、文件名替换、作业控制等功能。
Korn Shell
有很长一段时间,只有两类shell供人们选择,Bourne shell用来编程,C shell用来交互。为了改变这种状况,AT&T的bell实验室David Korn开发了Korn shell。ksh结合了所有的C shell的交互式特性,并融入了Bourne shell的语法。因此,Korn shell广受用户的欢迎。它还新增了数学计算,进程协作(coprocess)、行内编辑(inline editing)等功能。Korn Shell 是一个交互式的命令解释器和命令编程语言.它符合POSIX――一个操作系统的国际标准.POSIX不是一个操作系统,而是一个目标在于应用程序的移植性的标准――在源程序一级跨越多种平台。
Bourne Again Shell (bash)
bash是GNU计划的一部分,用来替代Bourne shell。它用于基于GNU的系统如Linux.大多数的Linux(Red Hat,Slackware,Caldera)都以bash作为缺省的shell,并且运行sh时,其实调用的是bash。
POSIX Shell
POSIX shell 是Korn shell的一个变种. 当前提供POSIX shell的最大卖主是Hewlett-Packard。在HP-UX 11.0,POSIX shell 就是/bin/sh,而bsh是/usr/old/bin/sh.
-----------------------------------引自《搜狗百科》
Zsh(Zshell),功能很强大,是最接近所有shell集合的shell
*************************************************************************************
在我们的/etc/shells下可以查看系统支持的shell。当前系统使用的shell可以用echo $0查看,用cat /etc/shells查看的shell可以直接当作命令。
注意:
a)nologin不能随便使用。
b)在每一次换shell中,最好返回到bash。可以用exit退出当前shell。
bash:
一、别名的替换 ----> alias 别名=‘命令’
alias是集成在bash中的
alias [-p] [名称[=值] ... ] 定义或显示别名。
alias命令是显示已定义的别名
unalias: 用法:unalias [-a] 名称 [名称 ...] 从别名定义中删除每一个"名字"
*注意:如果注销系统,则使用alias和unalias定义的别名将失去作用,解决方案是将命令写入文件当中,在用户的家目录中的一个隐藏文件,文件名为".bashrc",其主要功能就是用来保存命令的别名的定义.
*注意:在对于此文件中的命令别名进行编辑并保存之后,在当前已经运行的bash中并不会立即生效,需要重新加载此文件才能使配置生效,以下两种操作皆可实现:
1.重启bash:注销之后再次登录即可;
2.执行文件中定义的命令:使用source命令,或者.命令;
source或者.
source : 在当前 shell 中执行一个文件中的命令。
. :在当前 shell 中执行一个文件中的命令。
格式:source或者. 文件名 [参数]
二、bash的快捷键:
C:Ctrl键
M:Alt键
E:ESC键
DEL:Backspace键
C-l:清屏,相当于clear命令;
C-a:将光标跳转至命令行编辑模式的行首;
C-e:将光标跳转至命令行编辑模式的行尾;
C-c:结束前台进程;
M-.:引用上一个命令中的最后一个参数;(在Xshell中不能用)
E,.:功能同M-.
三、命令历史:
Bash进程会保存其会话中的用户曾经执行过的命令,以方便用户重复执行某个命令操作;
命令历史包括两个方面:
1.用户曾经执行过的命令;
2.用户曾经执行过的命令的路径;
在Bash中有一个内置的变量――PATH,PATH变量的值为当前系统中所有的命令的文件所在的路径的集合;
命令如何被shell执行的?
bash会将命令行的内容按照空白字符进行切片,分析第一个切片内容:
1.判断第一个切片的内容是内部命令还是外部命令;
如果是内部命令,直接运行;
如果是外部命令,先找hash表中的路径缓存,如果有,则直接执行;否则通过查找PATH变量中包含路径中,是否有对应名称的文件;
使用hash命令查看被记住的命令文件的路径;
-r:清空hash表;
使用history命令查看被记住的命令的命令行参数;
history - 显示或操纵历史列表。
格式: history [-c] [-d 偏移量] [n] 或 history -anrw [文件名] 或 history -ps 参数 [参数...]
常用选项:
-c:清空历史缓冲区中的命令历史记录;
-d OFFSET:删除指定的历史命令条目;
重复执行历史缓冲区中的命令:
!NUMBER:重复执行历史缓冲区中编号为"NUMBER"的命令;
!STRING:重复执行历史缓冲区中以"STRING"开头的最后一次执行过的命令;
!?STRING:重复执行历史缓冲区中包含了"STRING"的最后一次执行过的命令;
!-NUMBER:重复执行历史缓冲区中倒数第"NUMBER"条命令;
使用上、下Arrow可以从历史缓冲区中调用命令,回车之后执行;
!$:在历史缓冲区中调用最后一个命令的最后一个参数;
!^:在历史缓冲区中调用最后一个命令的第一个位置的参数;
!:NUMBER:在历史缓冲区中调用最后一个命令的第"NUMBER"位置参数
!SEQUENCE:NUMBER:历史缓冲区中调用第"SEQUENCE"条命令的第"NUMBER"位置参数
在bash中与命令历史相关的内置变量:
HISTSIZE:历史缓冲区中能够保存的命令历史的最大条目数量,默认值为1000;
HISTFILESIZE:~/.bash_history文件中能够保存的命令历史的最大条目数量,默认值为1000;
HISTTIMEFORMAT:在命令历史缓冲区中记录历史命令时,同时记录命令的执行的时间戳标记;可以使用date命令的FORMAT来表示时间的记录格式;默认值为空;
HISTCONTROL:控制命令历史的记录方式:
ignoredups:连续且相同的命令不会被记录到历史缓冲区;此为默认值;
ignorespace:以空白字符开头的命令不会被记录到历史缓冲区;
ignoreboth:上述两种情况都不会被记录到历史缓冲区;
四、命令补全――(TAB键的使用)
1.构成命令字符串的补全;
参考PATH变量中的路径,对命令进行补全:
如果,给出的字符串在PATH变量对应的路径中是唯一的,则直接补全命令;
如果,给出的字符串在PATH变量对应的路径中不唯一,则bash给出提示;
2.命令中参数所对应的字符串补全;
根据给出的路径进行补全:
如果,给出的字符串在给出的路径中是唯一的,则直接补全参数;
如果,给出的字符串在给出的路径中不唯一,则bash给出提示;
五、命令行展开
(a+b+c)(d+e+f)=ad+ae+af+bd+be+bf+cd+ce+cf
1.~展开:
~STRING:bash会自动将其展开为以"STRING"为用户名的用户的家目录;
~+:调用bash的内置变量"PWD"的值;
~-:调用bash的内置变量"OLDPWD"的值;
2.{}展开:
在"{}"中,可以填充一个以","分隔的路径列表,bash会将其展开为多个独立的路径;
六、命令的执行结果
在bash中,命令的执行结果有两种:
1.执行命令的输出结果:
命令引用或命令替换:
`` 相当于 $()
``:反向单引号,反引号;
2.执行命令的状态返回值:
与此前的一个命令是否成功执行相关的返回内容;
bash使用一个特殊的内置变量来保存其内容:$?
$?实际上保存的是一个数值,其取值范围:0-255
其中:
0:表示命令执行成功;
1-255:表示命令执行失败;
1,2,127:bash中内置的命令执行失败的状态返回值;
1:表示小问题;
2:表示严重问题;
127:表示命令本身出现问题;
其余数字(3-126,128-255):用户可以自定义的失败状态返回值;
七、引用功能:
'':强引用
凡是被单引号引用的内容,bash在处理时,一律视其为普通字符,即使其本身是bash定义的具有特殊功能和作用字符亦是如此,但单引号本身除外;
"":弱引用
被双引号引用的内容中,有些特殊字符仍然会保留其特殊含义,如: $,\,"";
八、转义功能:
\:bash定义的转义字符;大多数的情况下,"\"只能将其后面一个字符转义;
\COMMAND:取消定义过的命令别名,而使用命令本身的功能;
*:匹配任意长度的任意字符或字符串;(某些特殊位置的"."字符不能匹配;)
?:匹配任意单个字符;(某些特殊位置的"."字符不能匹配;)
[]:匹配指定范围内的任意单个字符,必须匹配且只能匹配一个字符;
指定范围的方法:
1.枚举法:列出所有有效字符;
2.范围指定:
[0-9]:表示所有单个的十进制数字;
[a-z]:a,A,b,B,c,C,...,x,X,y,Y,z
[A-Z]:A,z,Z
3.bash内建字符集:
[:lower:]:所有的小写字母
[:upper:]:所有的大写字母
[:alpha:]:所有字母,包括大小写;
[:digit:]:所有单个的十进制数字;
[:alnum:]:所有的字母和十进制数字;
[:punct:]:所有的符号;
[:space:]:表示空白字符,包括空格和制表符;
4.反向匹配:
注意:当中括号中有"^"表示字符集反向匹配时,注意"*"的使用;因为"*"通配范围可能会导致反向匹配失败;此类失败是因为bash的globbing是在贪婪模式下匹配的;
管道:|
通常是连接多个命令的,管道符号前面的命令的执行的输出结果通过管道传递给管道符号后面的命令,让后面的命令将前面命令的输出结果当成参数使用;
wc:
wc - print newline,word,and byte counts for each file
格式:wc [OPTION]... [FILE]...
常用选项:
*注意: 1.一般来讲,凡是被管道连接的命令,都应该能够在执行成功之后完成命令结果的输出,否则管道无意义;
2.管道不是万能的,有些场合没办法使用管道的;
在使用计算机的时候,实现某个功能的主体是程序!
程序=指令 + 数据 数据至关重要!!!!
文件,IO――Input/Output
可以用于输入的设备:文件
键盘设备、文件系统中的常规文件、网卡设备、声卡设备、磁盘设备等;
显示器、文件系统中的常规文件、网卡设备、声卡设备、磁盘设备等;
在内存中使用文件的方式是定义文件描述符,一个文件描述符对应一个文件;
0:表示标准输入,stdin,从键盘实现的输入数据流;
采用非标准设备文件实现的IO操作;
输入重定向:
<
~]# set -C //开启防止意外覆盖源文件开关,可以使用">|"符号完成覆盖重定向输出的操作,而无需关心是否开启此开关;
1.COMMAND {>|>>} /PATH/TO/SOMEFILE 2>&1
2.&>,&>>
bash中的其他特殊符号:
<<:here document,此处文档,结束标记;
<<<:here string,此处字符串,结束标记;