老大让我学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
作者:Aga.J
出处:http://www.cnblogs.com/aga-j
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
个人学习笔记仅供本人记录知识所用,不属发表性文章。