1. shell功能的一个汇总:
• 查找命令的位置并且执行相关联的程序
• 为shell变量赋新值
• 执行命令替代
• 处理 I/O重定向和管道功能
• 提供一个解释性的编程语言界面,包括tests,branches 和loops等语句
• 登录到一个unix系统,shell会为终端登录线索定义一些特征,然后出现提示符。在POSIX,Bourn,K shell中$符号为默认的提示符。C shell中默认的提示符是%号。
2. 常见shell
/usr/bin/sh POSIX shell
/usr/bin/ksh Korn shell
/usr/old/bin/sh Bourne shell
/usr/bin/csh C shell
/usr/bin/keysh A contest-sensitive softkey shell
/usr/bin/rksh Restricted Korn shell
/usr/bin/rsh Restricted Bourne shell
注:使用受限制的shell的用户不能:
• 更改目录
• 重新设定PATH变量的值
• 在路径名中使用/符号。
• 重定向输出
3. shell特征比较
4. 在shell中执行命令时通常同时按ctrl +c会中止当前正在运行的程序,然后返回到SHELL提示符下,也可以通过 stty-a 命令来自行定义中止键
5. POSIX shell的特性
别名:别名就是命令的一个新的名称。使用别名可以缩短长命令行输入。例 alias name= string unalias name
自动完成文件名:,连续敲两下esc键,shell会自动完成文件名
查找命令历史:history -n 显示指定数量的历史命令,默认为16
执行历史命令:r c 其中c为命令号
显示环境变量:env
环境变量内容:
• home路径的路径名
• 电子邮件的存放地址。
• 所在地的时区
• 登录的用户名
• shell查找命令的路径
• 终端类型
• 应用可能需要的其他东西
常用环境变量(.profile)
TERM,COLUMNS,LINES
使用的终端的类型。(例如2392,70092等等)
tset
使用TERM变量中的值来重新设定终端类型
LOGNAME
登录时使用的用户名
DISPLAY
特殊的x windows 变量
EDITOR=/usr/bin/vi
使用vi作为行编辑器
ENV=$HOME/.shrc
在shell启动的时候执行$HOME/.shrc文件
FCEDIT=/usr/bin/vi
在先前的命令行开始vi编辑线索。
HOME=/home/user3
指明登录的目录
~(波浪符号)
在POSIX shell中等同于HOME目录
HISTFILE=$HOME/.sh_history
存储所有的键入的命令的文件
LOGNAME=user3
指明登录标识或是用户名。
MAIL=/var/mail/user3
指明系统邮箱
OLDPWD=/TMP
指明你所进入的前一个目录
PATH=/usr/bin:$HOME/bin
指明查找命令的路径。
PS1=
指明你的主提示符。
PS1='[!] $'
在提示符中显示命令的行号
PS1='$PWD $'
在提示符中显示当前的工作路径(注意:必须使用单引号)
PS1='[!] $PWD $'
在提示符中显示行号和当前工作目录
PWD=/home/user3/tree
指明当前所在的目录。
SHELL=/usr/bin/sh
指明你的命令解释程序
TERM=2392a
指明使用的终端的类型,启动的时候使用命令eval 'tset –s –Q –h '系统会自动读取/etc/ttytype文件,并使用恰当地终 端类型来映射终端的端口。这在系统联接有不同型号的终端的时候十分有用
TMOUT=300
如果在指定的时间内没有命令或回车键入,shell会中止或者超时
TZ=EST5EDT
定义系统时区以显示正确的时间
6. 启动shell过程
1 getty
a. 显示/etc/issue中的内容
b.出现登录提示符
c.运行登录过程
2.Login
a.确认用户名和密码的正确性。
b.将用户放在home目录下
c.运行用户的shell
3. shell
a. 执行/etc/profile文件(POSIX,Bourne,和Korn shell) 或者是/etc/csh.login(C shell)
b. 执行用户home目录下的.profile 或者.login文件
c. 执行用户home目录下的.kshrc文件(POSIX和Korn shell)。如果用户创建了这个文件或是在ENV变量中设置.kshrc在.profile文件中。
d.出现shell提示符
一旦shell开始运行,就会从系统命令文件/etc/profile中读取命令执行.用户无论在什么时候登录和启动一个shell,这个文件都会被读取,然后shell会读取用户自己的.profile文件。这两个shell脚本被用来定制一个用户的环境。/etc/profile中设置了系统中每个用户的基本的环境。而.profile文件更多的是定制用户特殊的需要。因为每一个人都会使用/etc/profile文件,所以系统管理员有责任维护这个文件。当这两个程序都完成后就会出现shell提示符。
7. shell三种类型的替代
1. 变量替代
set
显示所有变量和值
$name
变量替代,例:echo $HOME,echo ${file} and $file1
2. 命令替代
$(command)或'command'
捕获一个命令的输出,用它作为另一个命令的参数,或是赋值给一个变量。象在变量替代中的一样,命令替代的执行是在命令行开始之前完成的。当命令行输出包含回车换行,它们会被空格代替。$ curdir=$(pwd)或$ curdir='pwd' pwd 的输出被赋给变量curdir
3. 波浪号替代
~
1~单个波浪号或是在/ 之前代表HOME变量中设置的路径名。2~一个波浪号跟一个+号代表PWD变量的值。PWD的值是在cd 到一个新的,当前的,工作目录时被设定的。3~一个波浪号跟一个-号会代表OLDPWD变量的值。OLDPWD变量是在cd 前一个工作目录时被设定的。4~如果一个波浪号跟一个字符串,然后是一个/ 符号 ,shell 会检查字符串是否与用户在系统中的名字一致。如果一致,~字符串会被用户登录的路径名所代替。5~波浪符号也能在别名中引用:
env
命令用来显示所有的当前环境中的定义的变量,和它们的值。
set
命令会显示所有的当前定义的变量,本地和环境中的变量,和它们的值。
unset
命令用来删除指定变量的当前的值。这个指被赋为空值 NULL
export
传递变量到环境
8. 引用:许多的字符在shell中有“特别”的含义:- 空格- 回车- $- #- *- < > 引用消除(忽略)这些字符的特殊含义。
\
反斜杠消除紧跟在它后面的特殊字符的特殊意义
'
消除特殊字符的特殊含义,在单引号包围之中的所有的特殊字符的特殊含义都会被忽略
"
包容性要差一点,大多数的字符都可以使用双引号来去除特殊含义。只有$符号(当其被用来作为变量和命令替代的时候),和反斜杠例外,可以在双引号中使用反斜杠来除掉 $号的特别含义
9. 输入输出重定向:提供重定向一个命令的输入和输出的功能,输入输出重定向总是在一个命令和一个文件之间进行
基本的过滤器例如sort,grep和wc
10. 管道:提供将命令连接起来的能力
过滤器
cut
抽取指定的列或者字段。并且显示在屏幕上。一个数字列表被用来告诉cut要抽取得哪些列或字段。列表格式:A-B 从A到B的列或者字段,A. 从A到列或字段的最后一行,-B 从列或字段的开头到B,A,B 字段A或者B。例:cut -f2-5 -d ':' -s /etc/passwd
-c 选项剪切字段
-f 选项剪切列
-d 默认的字段分隔符为tab符号。如果用其他的分隔符,可以使用-d char 选项,其中char是分割你的输入的字段的字符。冒号是一个通用的分隔符
-s 在剪切字段的时候丢弃所有的没有分隔符的行
tr
转换字符,例1:who | tr -s " " 例2:date | cut –c1-3 | tr "[:lower:]" "[:upper:]"
[-s] [string1] [ string2]
tee
输出到一个文件同时输出到标准输出。通常在执行一个复杂的管道操作的时候,管道中间的命令的输出被提交到管道中的下一个命令处理,这时不能够看到中间命令的输出。tee命令被用来分接一个管道。Tee从标准输入读取数据,然后输出到标准输出,同时输出到一个指定的文件。例:who | tee whoson | wc -l
-a 在文件末尾添加输出而不是覆盖文件
pr
打印并且格式化输出到标准输出。例:ls | pr -2
管道的每一个位置的命令的要求:
• 任何在一个|符号左边的命令必须能够输出到标准输出。
• 任何在 | 符号右边的命令必须能够从标准输入读取数据。
• 任何在两个 | 符号之间的命令必须能够接收标准输入并且能够制造输出到标准输出。(是一个过滤器)
管道的不同部分的重定向的有效性的一个汇总:
• 任何在一个管道符号的左边的命令能够被重定向输入,和错误,因为它的输出被传送到管道右边的命令。
• 任何在一个管道右边的命令能够被重定向输出,和错误。因为它的输入来自管道中前一个命令。
• 任何在管道中间的命令能重定向错误,因为它的输入来自前一个命令而它的输出要送到管道中的下一个命令。
11. 后台进程:在一个命令的末尾使用一个“&”符号可以使一个命令在后台运行。通常需要重定向后台运行的程序的输出,以免后台命令的输出影响当前的终端线程
命令>cmd.out & 例子:grep user * > grep.out &
• 使命令在后台执行。
• 当后台任务开始后立刻返回提示符。
• 重定向命令的输出,这样命令的输出就不会影响当前屏幕的显示。
• 退出系统会中止后台运行的进程。用户会在第一次试图退出时收到一个警告:“There are running jobs”。用户必须再次键入Exit 或ctrl+d来中止这个线索。
当一个命令被放在后台执行,如果设置了monitor选项(set -o moniotr),shell会报告命令的任务号和进程ID。
jobs 显示当前运行的任务
ctrl + z 将当前前台运行的程序挂起。
fg [%number] 将指定任务号的任务放在前台运行
fg [%string] 将以指定字符串开头的命令放在前台运行
bg [%number] 将指定任务号的任务放在后台运行
bg [%number] 将指定任务号的任务放在后台运行
susp 暂时停止前台进程。这个信号通常被设置为ctrl + z.。这个挂起字符通常是在登录时通过.prifile指定的,语法为:stty susp ^Z
nohup 命令 使命令不被挂起。退出系统通常都会中止后台的进程。但是如果一个后台命令以nohup开头,系统会继续完成进程。当使用nohup的时候,用户通常都要重定向输出到文件中。如果用户没有指定一个输出文件,nohup会自动地重定向输出到nohup.out文件中
nice [-N] 命令使一个命令以更低的优先级运行。值为1到19的整数。默认值为10。一个进程的nice值越高,它的优先权就越低
kill [-s signal_name] PID [PID....] 发送一个信号给指定的进程。kill 命令能被用来中断任何命令,其中包括nohup,和后台命令。kill发送一个信号给一个进程。更具体的说,kill发送一个信号给一个进程。进程收到其中的大多数的信号后,默认的行动都是死亡。发送信号者必须是进程的属主;kill不能够被用来杀掉其他用户的进程除非使用kill的是超级用户。命令kill –l 会列出所有支持的signal-name(信号名)的值。当 –l 选项被使用的时候,每个信号的符号名称都会输出到标准输出上。要想杀死一个进程,你可以指明进程ID或任务号。当指明任务号的时候,必须使用%作为前缀。如果指明的进程号为0,会终止所有的与当前shell相关的所有的进程,包括当前的shell。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/4670/viewspace-310371/ ,如需转载,请注明出处,否则将追究法律责任。