代码改变世界

老大让我学linux之初识linux shell

2011-07-22 09:10  Aga.J  阅读(1664)  评论(0编辑  收藏  举报

    什么是shell?Shell是一种命令解释器,用户只需要在shell内输入shell可识别的命令,即可借助shell进行一些系统操作,这和我们日常所用的windows 下的命令行一样,所以 linux shell可以类比做windows 下的命令行。

    Linux提供了几种shell程序供我们选择使用,常用的有Bourne(bsh),C(csh),Korn(我用的是Ubuntu 桌面版,它的shell类型是bash-Bourne shell的增强版,可以通过在shell内输入echo $SHEL来打印)。

下面是摘自网络上的一些关于linux几种常见的shell的简单介绍:

    Bourne shell是由Steven Bourne 编写的,是UNIX 的缺省shell。Bourne shell的shell编程能力很强。但它不能处理命令的用户交互特征bash 是Bourne shell的增强版。

    Cshell是由加利福尼亚大学伯克利分校的Bill Joy编写的。它能提供Bourne shell所不能处理的用户交互特征,如命令补全、命令别名、历史命令替换等。很多人认为, C shell的编程能力不如Bourne shell,但它的语法和C语言类似,所以C程序员将发现C shell很顺手。tcsh 是Cshell的增强版本和Cshell完全兼容。

    K o r nshell是由Dave Korn 编写的。Korn shell融合了C shell和Bourne shell的优点,并和Bourne shell完全兼容。 Korn shell的效率很高,其命令交互界面和编程交互界面都很不错。

    Public Domain Korn shell( p d k s h )是Korn shell的增强版。

      bash 是大多数L i n u x系统的缺省shell。它克服了Bourne shell的缺点,又和Bourne shell完全兼容

B a s h有以下的特点:

       1 补全命令行。 当你在bash 命令提示符下输入命令或程序名时,你不必输全命令或程序名,按Tab 键,b a s h将自动补全命令或程序名。

       2 通配符。 在b a s h下可以使用通配符 * 和?。*可以替代多个字符,而?则替代一个字符

       3 历史命令。 bash 能自动跟踪你每次输入的命令,并把输入的命令保存在历史列表缓冲区。缓冲区的大小由HISTSIZE 变量控制。当你每次登录后,home 目录下的 .bash_history 文件将初始化你的历史列表缓冲区。你也能通过history 和fc 命令执行、编辑历史命令。

       4别名。 在b a s h下,可用alias 和unalias 命令给命令或可执行程序起别名和清除别名。这样你可以用自己习惯的方式输入命令。

    那么shell能做什么?Shell可以执行linux的系统内部的命令

有些命令可能有权限设置,权限不够的用户无法执行,这需要我们较好的理解并掌握linux的权限管理,还有一些命令不能直接执行,需要到命令所在目录下才可以执行,这是因为shell在linux系统上预设的环境变量的路径中找不到命令,所以其实我们的shell命令的执行必须先根据环境变量预设的路径进行命令查找,再做命令解释的

Shell还可以执行应用程序(注意到linux上大部分应用程序是没有后缀的,除了常见的sh后缀那些),Shell还可以作为编程工具来执行复杂的命令程序

    常用的shell命令有(详细shell命令的使用方式,linux系统内有详细的文档介绍,只需要使用man命令+想要查询的命令,就可以查询到该命令的使用方式和参数等):

Shell命令名称

基本语法

修改当前账户密码

passwd

命令的联机帮助查询

man 命令

远程登录

rlogin 主机名 [-l 用户名]

列出文件或目录下的文件名

ls [参数] [name]

改变工作目录

cd [name]

复制文件

cp [-r] 源地址 目的地址

移动或更改文件,目录名称

mv 源地址 目的地址

建立新目录

mkdir 目录名

删除目录

rmdir 目录名

删除文件

rm 文件名

列出当前文件所在目录

pwd

查看文件内容

cat 文件名

查看目录所占磁盘容量

du [-s] 目录

文件传输

rcp [-r] 源地址 主机名:目的地址

rcp [-r] 主机名:源地址 目的地址

本地与远程工作站传输 ftp

文件权限设定

改变文件或者目录的读写执行权限

chmod [-R] mode name

改变文件或者目录的所有权

chown [-R] 用户名 name

检查自己所属的工作组名称

groups

改变文件或者目录工作组所有权

chgrp [-R] 工作组名 name

改变文件或目录最后修改时间

touch name

文件链接

ln 旧文件名 新文件名

文件中字符串的查找

grep string file

比较文件或者目录内容

diff [-r] name1 name2

进程控制

(1)查看进程

ps [-aux]

(2)终止进程

kill [-9] PID

(3)在后台执行进程

例如:

cc file1.c & 将编译 file1.c 文件的工作置于后台执行。

语法:按下 C o n t r o l + Z键,暂停正在执行的进程。键入b g命令,将暂停的进程置于后台继续执行。

cc file2.c

^ Z

S t o p p e d

b g

(4)查看正在后台执行的进程

jobs

Shell变量

(1) 查看shell变量的设定值

set 查看所有shell变量的设定值

echo $变量名 显示指定的shell变量的设定值

(2) 设定shell变量

set var = value

(3) 删除shell变量

unset var

别名

alias name

历史命令

history

!!重复执行前一个命令

文件压缩

compress 文件名 压缩文件

compressdir 目录名 压缩目录

管道命令的使用

(1)将命令1的执行结果送到命令2,作为命令2的输入

命令1 | 命令2

例如 cat file1 | more

输入/输出的控制

将命令的执行结果送到指定的文件中

ls –l > list

查看系统中的用户

who

finger

查看用户名

who am i

   

    linux shell再深入:shell是一个命令语言解释器,它拥有自己内建的shell命令集,也可以使用系统内的程序作为命令,例如cd是一个shell的内部命令,而cp等则是某个目录下的一个程序,我们不需要关心这个命令是建立在shell内部还是一个单独的程序。

    用户发起命令执行请求时,shell首先检查该命令是否为内部命令,如果不是则检查它是不是一个应用程序,shell通过在系统环境变量预设的路径中查找这些可执行的程序,如果查找成功,那么该内部命令或者程序就会被分解为 system call 并传递到linux kernel。

    注意到shell其实是一个解释型的程序设计语言,支持函数,变量,数组,程序控制结构。

    系统初启后,核心为每个终端用户建立一个进程执行Shell解释程序。它的执行过程基本上按如下步骤:

     (1)读取用户由键盘输入的命令行。

     (2)分析命令,以命令名作为文件名,并将其它参数改造为系统调用execve( )内部处理所要求的形式。

     (3)终端进程调用fork( )建立一个子进程

     (4)终端进程本身用系统调用wait( )来等待子进程完成(如果是后台命令,则不等待)。当子进程运行时调用execve( ),子进程根据文件名(即命令名)到目录中查找有关文件(这是命令解释程序构成的文件),将它调入内存,执行这个程序(解释这条命令)。

     (5)如果命令末尾有&号(后台命令符号),则终端进程不用系统调用wait( )等待,立即发提示符,让用户输入下一个命令,转⑴。如果命令末尾没有&号,则终端进程要一直等待,当子进程(即运行命令的进程)完成处理后终止,向父进程(终端进程)报告,此时终端进程醒来,在做必要的判别等工作后,终端进程发提示符,让用户输入新的命令,重复上述处理过程。

后记:bash的源码分析

编译bash源码(网络上有一篇文章介绍如何编译安装bash来打开bash history的日志功能http://www.libertyvps.com/thread-99-1-1.html

http://ftp.gnu.org/gnu/bash/上选择最新的bash版本下载,在linux环境中解压 tar zxf bash-4.2.tar.gz,然后使用命令

./configure –prefix=/usr/local/bash-4.2 (configure过程中会产生新代码)

make && make install

使用bash源码包内自带的configure脚本进行编译,然后再整体的make一次,这样就编译成功了。

下面这篇文章完整的说明了bash的源码结构,很值得一看,先在这里记下:

http://files.linjian.org/articles/bash_study/bash_linjian.html