一、shell的基本概念:
shell 意思 是外壳,它是 离用户最近的程序。shell提供用户操作系统的接口, 我们通过 shell 将输入的命令与 内核 通信,使内核可以控制 硬件 来正确无误的工作。广义上的shell包含两类GUI和CLI。
GUI:Gnome,KDE,Xface
CLI:sh,csh,ksh,bash,tcsh,zsh(合法的shell要写入/etc/shells这个文件,系统某些服务在运行过程中,可能会去检查用户能够使用的shell)
当用户登陆的时候,系统会分配一个shell来进行工作。默认会取得的shell记录在/etc/passwd文件中,可以看到hao这个用户默认取得的是bash。
[hao@hao ~]$ cat /etc/ passwd root:x: 0 : 0 :root:/root:/bin/ bash bin:x: 1 : 1 :bin:/bin:/sbin/ nologin ... hao:x: 500 : 500 :haohao:/home/hao:/bin/bash
当有多个用户登陆的时候,会有多个进程,进程之间彼此互不相干,因为对于每个进程来说,它只认为当前主机上只有自己和内核存在。linux允许一个用户账号登陆多次 。
进程是程序的副本,进程是程序执行的实例,是有生命周期的,由内核进行管理。
用户工作环境,多个用户尽管使用的都是shell程序,但是各个用户的工作环境设定却可以各不相同,只不过默认情况下除了管理员,都是一样的。
shell,子shell。可以在一个shell中在启动一个子shell。父shell和子shell都不能意识到彼此正在运行。很多时候对父shell的设定对子shell无效,子shell的设定对父shell也无效。下面的通过pstree命令可以看出该关系,如果退出到上一层bash,可以用exit命令。退到最上一层时候,会退出当前登陆。
[hao@hao ~ ]$ bash [hao@hao ~ ]$ pstree init -+-NetworkManager-+- dhclient | `- {NetworkManager} |- abrtd |- acpid ... |-sshd---sshd---sshd---bash---bash---pstree |- trashapplet ... [hao@hao ~ ]$ bash [hao@hao ~ ]$ pstree init -+-NetworkManager-+- dhclient | `- {NetworkManager} |- abrtd |- acpid ... |-sshd---sshd---sshd---bash---bash---bash---pstree |- trashapplet ...
当然,bash下也可以嵌套运行csh,ksh
[hao@hao ~ ]$ pstree init -+-NetworkManager-+- dhclient | `- {NetworkManager} |- abrtd |- acpid |- atd ... |-sshd---sshd---sshd---bash---pstree |-udevd--- 2 * [udevd] ` - wpa_supplicant [hao@hao ~ ]$ csh [hao@hao ~ ]$ pstree init -+-NetworkManager-+- dhclient | `- {NetworkManager} |- abrtd |- acpid |- atd ... |-sshd---sshd---sshd---bash---csh---pstree |-udevd--- 2 * [udevd] ` -wpa_supplicant
二、为什么学习shell
- 一法通,万法通。虽然X Window将所有用到的软件都集成在一起,但它并非是一个完整的套件,所以某些时候当升级或者使用其他套件管理模块时,会遇到一些麻烦。
- 远程管理:命令行界面比较快。Linux的管理经常需要远程联机,联机时命令行界面的传输速度比较快,而且较不容易出现断线或者信息外流。
三、shell的特性 :
1、命令历史、命令补全
默认的命令记忆功能可以达到1000(环境变量HISTSIZE保存该数值)个,前一次登陆以前所执行过的命令历史记录在~/.bash_history,而本次登陆所执行的命令都被暂存在临时内存中,当注销后,该命令记忆才会被记录到~/.bash_history当中。
查看命令历史(包含本次执行的history命令):history
-c(clear):清空命令历史
-d offset [n]:删除第offset条命令,history -d 500 10从第五百条命令往后删10条
-w(wriet):将当前缓冲区中历史命令写入到历史文件中去。
n(number):列出最近的n条命令行。
history历史命令的使用技巧:
!n:执行命令历史的第number命令
!-n:执行命令历史记录的倒数第n条命令。
!!:执行上一条命令。
!vi:执行命令历史中最近一个以vi开头的命令。
[hao@hao ~ ]$ history 1 ll etc/ ... 141 ls - a 142 LANG= en 143 ls - a 144 ll ~/ .bash_history 145 cat ~/ .bash_history 146 man history 147 history - w 148 history 149 cat ~/ .bash_history 150 history [hao@hao ~]$ ! 141 ls - a . .bash_history .cache .gconf .gnote .gvfs .mozilla .recently -used.xbel .xsession-errors.old ?????? ?????? .. .bash_logout .config .gconfd .gnupg .history .nautilus . ssh ?????? ?????? .ICEauthority .bash_profile .dbus .gnome2 .gstreamer - 0.10 .imsettings.log .pulse .viminfo ????????? ?????? .abrt .bashrc .esd_auth .gnome2_private .gtk -bookmarks .local .pulse-cookie .xsession-errors ?????? ??????
命令补全:命令补全是在PATH环境变量下搜索命令。tab键自动补全(唯一),连敲两下tab键可以搜索所有已所敲字符为开头的命令。
2、管道、重定向
3、命令别名
root@hao:~ # alias alias egrep = ' egrep --color=auto ' alias fgrep = ' fgrep --color=auto ' alias grep = ' grep --color=auto ' alias l = ' ls -CF ' alias la = ' ls -A ' alias ll = ' ls -alF ' alias ls = ' ls --color=auto '
alias CMDALIAS='COMMAND [options] [arguments]'
root@hao:~# alias cls= ' clear '
在shell中定义的别名只在当前shell的生命周期中有效,别名的有效范围为当前shell进程,即使相同的用户在另一个shell中。若想让该别名永久有效,只需要将该别名写入shell应用程序的配置文件。
撤销命令别名:unalias CMDALIAS;
如果命令别名与原命令是一个名字,但是命令别名加入了一些选项。若此时想使用原命令,则需要使用\COMMAND。
4、命令替换
把命令中某个子命令替换为其执行结果的过程叫做命令替换,如下面把子命令pwd的执行结果替换为命令echo的执行结果。
格式$(command)或者`command`
hao@hao:~$ pwd /home/ hao hao@hao: ~$ echo " This current /home/hao " This current /home/ hao hao@hao: ~$ cd /etc/sysctl.d/ hao@hao:/etc/sysctl.d$ echo " This current directory is $(pwd). " This current directory is /etc/ sysctl.d. hao@hao: /etc/ sysctl.d$ cd hao@hao: ~$ echo " This current directory is $(pwd). " This current directory is /home/hao.
在当前目录下(./)创建一个以当前时间命名的txt文件。
hao@hao:~$ touch ./ file -$( date +%F-%H-%M-% S).txt hao@hao: ~$ ls examples.desktop file - 2014 - 08 - 01 - 16 - 52 - 15 .txt ?????? ????????? ?????? ?????? ?????? ?????? ?????? ?????? hao@hao:~$
补充,bash支持的三种引号:
- 单引号'':强引用,不完成变量替换
- 双引号"":弱引用,可以实现变量替换
- 反引号``:命令替换
5、命令行编辑
光标跳转:
ctrl+a跳到行首
ctrl+e跳到行尾
ctrl+u删除光标至命令行首的内容
ctrl+k删除光标至命令行尾的内容
ctrl+->向右跳转一个单词
ctrl+<-向左跳转一个单词
ctrl+l清屏
6、命令行展开
7、文件名通配,globbing
*: 任意长度的任意字符。/root/test目录下以a开始的任意文件
root@hao:~/test# tree / root / root |-- m | `-- n | `-- t ` -- test |-- a |-- a123 |-- ab123 |-- abc |-- x12 |-- xyz ` -- xyz123 4 directories, 7 files root@hao: ~/test# ls a* a a123 ab123 abc
?: 匹配任意单个字符。文件名第二个字符是y的文件
root@hao:~/test# ls ?y* xyz xyz123
[]: 匹配指定范围内的任意单个字符。 以字母开头,数字结尾的文件。还有一些特殊字符,可以使用man 7 glob查看,常用的如下。
- [[:space:]], 空白字符
- [[:punct:]], 标点符号
- [[:lower:]], 小写字符
- [[:upper:]], 大写字母
- [[:alpha:]], 大小写字母
- [[:diget:]], 数字
- [[:alnum:]],字母和数字
,root@hao:~/test# ls [a-zA-Z]*[ 0 - 9 ] a123 ab123 x12 xyz123
以字母开头和结尾的文件名中间包含空格的文件
root@hao:~/test#
touch
'
a b
'
root@hao:~/test#
ls
a b a123 ab123 abc x12 xyz xyz123
root@hao:~/test#
ls [[:alpha:]]*[[:space:]]*
[[:alpha:]] a
[^]: 匹配指定范围之外的任意单个字符。以非a开头的所有文件
root@hao:~/test# ls [^a]* x12 xyz xyz123
8、变量
9、编程