- 论坛徽章:
- 0
|
本帖最后由 raylei_walker 于 2016-07-04 19:24 编辑
上周五看公司的一个大牛用shell脚本巧妙的解决了工作中的一个问题。自己平时开发也是基于linux平台的,但没有深入去学习过shell脚本,觉得自己有必要好好学学一下,这不光能解决一些问题,还能提交自己的工作效率。于是上周末开始在家开始学习shell,准备坚持把自己的学习心得和笔记拿出来和大家分享一下、共同进步,因为以前基本都是从别人的帖子、博客学习知识,自己从没有写过什么和大家分享。
各位大牛们请多多指教。
第一章 shell的启动
1.1 系统支持哪种shell
从最早的贝尔实验室发明的unix、到BSD unix和后来的linux系统,系统内核在不断的演进和变化,用于和内核交互的应用程序也有各种不同的版本。这个应用程序叫做shell。其中主要的有:bourne shell,csh,tcsh,bash,korn shell等等。虽然不同shell有差别,但大部分功能是类似的。
系统支持的shell存放在/etc/shells文件中:- raylei@raylei:~$ cat /etc/shells
- # /etc/shells: valid login shells
- /bin/sh
- /bin/dash
- /bin/bash
- /bin/rbash
- /bin/csh
复制代码 1.2 系统启动哪种shell
既然有那么多种shell,怎么来查看系统使用哪种shell呢?默认的启动shell是在/etc/passwd中定义的,该文件记录了系统上对应的用户信息,下面是我的系统上/etc/passwd中的内容:- raylei@raylei:~$ cat /etc/passwd
- root:x:0:0:root:/root:/bin/bash
- daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
- bin:x:2:2:bin:/bin:/usr/sbin/nologin
- ... //省略了其中了很多行
- pulse:x:115:122:PulseAudio daemon,,,:/var/run/pulse:/bin/false
- raylei:x:1000:1000:raylei,,,:/home/raylei:/bin/bash
- ftp:x:116:125:ftp daemon,,,:/srv/ftp:/bin/false
复制代码 每条记录由6个冒号分隔出7个字段。这7个字段对应的意思分别为:
用户名: 密码: 用户ID: 组ID: 注释字段: 初始工作目录: 默认启动shell
最后一个字段指明了每个用户登录时默认启动哪种shell。
在启动之后,也可以运行下面命令去查看系统的登录shell,注意这里的环境变量SHELL指的是登录shell,而不是当前使用哪种shell:- raylei@raylei:~$ echo $SHELL
- /bin/bash
- raylei@raylei:~$ csh
- % echo $SHELL
- /bin/bash #这里还是登录的bash shell,而不是csh
复制代码 通过上面两种方法,可以看出linux的默认启动shell是bash。
1.3 切换shell
切换shell分为两种,即一种为临时在登陆shell中运行其他shell,另外一种为切换登陆shell。
对于第一种很简单,只要在登陆shell中运行对于shell的名字即可:- raylei@raylei:~$ ps -o pid,ppid,gid,sid,comm,tty
- PID PPID GID SID COMMAND TT
- 29224 29214 1000 29224 bash pts/1
- 29238 29224 1000 29224 ps pts/1
- raylei@raylei:~$ csh
- % ps -o pid,ppid,gid,sid,comm,tty
- PID PPID GID SID COMMAND TT
- 29224 29214 1000 29224 bash pts/1
- 29241 29224 1000 29224 csh pts/1
- 29243 29241 1000 29224 ps pts/1
- % dash
- $ ps -o pid,ppid,gid,sid,comm,tty
- PID PPID GID SID COMMAND TT
- 29224 29214 1000 29224 bash pts/1
- 29241 29224 1000 29224 csh pts/1
- 29244 29241 1000 29224 dash pts/1
- 29246 29244 1000 29224 ps pts/1
复制代码 从第一条命令的运行结果可看出,当前的shell为bash。当运行csh命令时,bash会创建一个子进程来运行csh命令。当运行dash时,同样,csh会创建一个子进程来运行dash。
如果想切换登陆shell的话,那就需要用chsh命令(change shell):- raylei@raylei:~$ chsh -s /bin/csh
- Password:
- raylei@raylei:~$ echo $SHELL
- /bin/bash
复制代码 改了为什么没有变呢?上面已经介绍了登录shell是由上面介绍的/etc/passwd中的第七个字段决定的,那来看看现在这个字段有没有改变,- raylei@raylei:~$ cat /etc/passwd | grep raylei
- raylei:x:1000:1000:raylei,,,:/home/raylei:/bin/csh
复制代码 这里运行chsh改变了该文件,但该文件只在系统登录时读取验证,所以需要重新启动系统。重启后:- % echo $SHELL
- /bin/csh
- % cat /etc/passwd | grep raylei
- raylei:x:1000:1000:raylei,,,:/home/raylei:/bin/csh
复制代码 1.4 登录shell
登录shell,就是系统登录时默认运行的shell。登录shell会按下面顺序读取几种配置文件:
◎/etc/profile
◎$HOME/.bash_profile
◎$HOME/.bash_login
◎$HOME/.profile
/etc/profile是系统上默认的shell主启动文件,系统上的每个用户登录时都会执行这个启动文件。其他三个是用户专有的,每个用户都可以定制自己喜欢的特性。但一般的linux发行版只提供其中的一个。在我的ubuntu中,提供了最后一个.profile:- raylei@raylei:~$ ls .bash*
- .bash_history .bash_logout .bashrc
- raylei@raylei:~$ ls .p*
- .profile
- raylei@raylei:~$ vim .profile
- if [ -n "$BASH_VERSION" ]; then
- # include .bashrc if it exists
- if [ -f "$HOME/.bashrc" ]; then
- . "$HOME/.bashrc"
- fi
- fi
- # set PATH so it includes user's private bin if it exists
- if [ -d "$HOME/bin" ] ; then
- PATH="$HOME/bin:$PATH"
- fi
复制代码 从这个文件可以看出,如果定义了BASH_VERSION环境变量和文件$HOME/.bashrc存在时会去执行$HOME/.bashrc。最后一个if是设置环境变量PATH,这个变量主要用于去搜索对应的可执行命令。
1.5 交互式shell
交互式shell,简单地说,就是shell启动后,等待用户输入命令,然后执行命令,再把执行结果返回给用户。例如在登录shell中运行bash命令,就是启动一个交互式bash:- raylei@raylei:~$ ps -o pid,ppid,gid,sid,comm,tty
- PID PPID GID SID COMMAND TT
- 3051 3041 1000 3051 bash pts/0
- 3066 3051 1000 3051 ps pts/0
- raylei@raylei:~$ bash
- raylei@raylei:~$ ps -o pid,ppid,gid,sid,comm,tty
- PID PPID GID SID COMMAND TT
- 3051 3041 1000 3051 bash pts/0
- 3067 3051 1000 3051 bash pts/0
- 3080 3067 1000 3051 ps pts/0
复制代码 进程ID为3067的就是交互式shell。其中通过X window中启动的伪终端都是交互式shell。
交互式shell与登录shell不同,前者只会去检查$HOME/.bashrc存不存在,如果存在,从该文件读取配置命令。
1.6 非交互式shell
非交互式shell就是指执行脚本时的shell,当前shell会创建一个子进程shell去从脚本中读取对应的命令一直执行完,执行完立即退出。
1.7 shell的有用选项
一般shell都提供了一个比较有用的选项。
-c string:表示从string中解释出对应的命令来运行。该命令去在编写C语言程序时经常用到。- raylei@raylei:~$ sh -c "sleep 10"&
- [1] 3136
- raylei@raylei:~$ ps -o pid,ppid,gid,sid,comm,tty
- PID PPID GID SID COMMAND TT
- 3051 3041 1000 3051 bash pts/0
- 3136 3051 1000 3051 sh pts/0
- 3137 3136 1000 3051 sleep pts/0
- 3139 3051 1000 3051 ps pts/0
复制代码 从上面的运行结果,从先从bash中启动一个bourne shell,然后bourne shell从-c后面的"sleep 10"中解析出要运行的命令,然后运行。 |
评分
-
查看全部评分
|