1 什么是shell
shell是linux系统提供给用户调用命令接口的程序,它允许用户输入需要执行的命令,这些命令可以是编译好了的程序,也可以是一个系统可执行的脚本。linux有多种shell(bash,csh,sh,tcsh),大多数都是从Bourne shell(sh)中演变而来的。linux中,安装的标准shell总是 /bin /sh (是一个软连接,链接到bash),bash是GNU工具集中的bash(GNU Bourne-Again Shell)。各个版本的shell的详细信息如下:
sh(Bourne) 源于unix 早起版本的最初shell,其他大多数的shell由此演变而来
csh,tcsh, zsh 是C shell及其变体
ksh,pdksh David Korn编写的shell, 它是很多商业版本的unix默认的shell
bash GNU 项目你的shell,开源免费
shell 是用户与操作系统之间的一层壳,功能和x视窗系统一样,是用户和系统交互的桥梁。
2 管道和重定向
2.1重定向
2.1.1重定向输出
ls -al > t.txt
就像上面的命令,列出当前的目录文件信息,然后将这些信息从标准输出重定向到人件t.txt。补一些标准文件描述符的信息,每一个文件都有一个文件描述符(fd>2),标准输入(从终端接收输入)的文件描述符为0,标准输出(输出信息到终端屏幕)的文件描述符为1, 错误输出的文件描述符为2。回到正题,我们可以通过使用 `>`(重定向输出,输出的内容覆盖接受内容的文件),`>>`(重定向输出,内容追加到接受内容的文件), `<`(将其他文件的内容作为输入)来将我们的输出从标准的输入输出中定向到其他的文件描述符。关于重定向输出,又有两种`1>或1>>`(标准输出),`2>或2>>`(标准错误输出),默认`>`是标准输出。举个例子:
kill -HUP 1234 >killout.txt 2>killerr.txt
也可以将标准输出和标准错误输出到同一个文件
kill -HUP 1234 >killouterr.txt 2>&1
2.1.2 重定向输入
more < killout.txt
就像上面的例子,我们将killout.txt文件中的内容作为标准输入,意义不大,和后面直接接文件一样
2.2 管道
我们可以用管道连接符'|'来连接进程。在linux下,通过管道连接的进程可以同时运行,随着数据流在他们之间的传递可以自定的进行协调。我们通常将一个进程的输出,通过管道,作为另一个程序的输入。管道可以简化我们的很多操作,例如,我们要对ps的命令的输出进行排序,加入不使用管道:
ps > psout.txt
sort psout.txt > pssort.txt
使用管道可以一步到位
ps | sort > pssort.txt
假如想在屏幕上分频查看,可以这样
ps | sort | more
3 作为程序语言设计的shell
编写shell脚本程序有两种方式,我们可以输入一系列的命令,然后让shell交替的执行他们。也可以将这些命令保存到一个文件中,修改文件的属性为可执行,然后把这个文件当成程序来调用。
3.1 交互式程序
在命令行上直接输入各种命令,是学习和测试shell的一种方式。例如:
如果需要继续输入,正常的$ 提示符会变成>,提示我们继续输入,等我们书写完成了,他就会自动的执行程序。
3.2创建脚本
还是上面的例子,我们可以将上面的内容保存到一个文件中,文件的内容如下:
#是注释,开头的部分#!/bin/bash为固定部分(我们可以换成其他的shell),指明执行这个脚本时使用什么shell来执行。然后我们修改文件属性,使得脚本文件为可执行文件。这样就可以直接执行这个脚本了,也可以 sh scriptname 或bash scriptname。文件的末尾最好用exit命令指定一个执行返回码,这样我们可以在终端中执行完程序后观察我们的脚本是否正常的执行(linux 终端通过$?变量引用上一个执行进程的exit code)。