Shell学习18-深入讨论与shell工具
时间:2010-08-23 来源:soqsoq
Shell学习18-深入讨论与shell工具
2010.08
1.<<
该命令的一般形式为:
command <<word
t e x t
w o r d
这里再简要回顾一下< <的用法。当s h e l l看到< <的时候,它就会知道下一个词是一个分界符。在该分界符以后的内容都被当作输入,直到 s h e l l又看到该分界符(位于单独的一行)。这个分界符可以是你所定义的任何字符串。
可以使用< <来创建文件、显示文件列表、排序文件列表以及创建屏幕输入。
2.快速创建一个文件
可以使用这种方法快速创建一个文件,并向其中存入一些文本:
$ cat >> myfile <<NEWFILE
现在可以输入一些文本,结束时只要在新的一行键入 N E W F I L E即可,这样就创建了一个名为m y f i l e的文件,该文件中包含了一些文本。
如果打开了一个已经存在的文件,输入的内容会附加到该文件的末尾。
如果使用t a b键,注意,一些老版本的 s h e l l可能无法正确理解它的含义。为了解决这一问题,可以在< <之后加一个横杠-,就像下面这样:
cat >> myfile <<- NEWFILE
. . .
3. 使用date命令创建日志文件
为了改变日期和时间的显示格式,可以使用如下的命令:
date option + %format
使用加号‘+’可以设置当前日期和时间的显示格式。下面的例子将日期以日、月、年的格式显示:
$ date +%d%m%y
090699
下面是一些常用的日期格式:
$ date +%d-%m-%y
09-06-99
$ date +%A%e” “ %B” “%Y
Wednesday 9 June 1999
下面的命令可以使时间按照hh:mm的格式显示:
$date +%R
10:07
$ date +%A” “%R” “%p
Wednesday 10:09 AM
下面的命令可以显示完成的时间:
$date +%T
10:25:11
注意,如果希望在日期和时间的显示中包含空格,要使用双引号。
4. 信号
信 号 信 号 名 含 义
1 S I G H U P 挂起或父进程被杀死
2 S I G I N T 来自键盘的中断信号,通常是< C T R L - C >
3 S I G Q U I T 从键盘退出
9 S I G K I L L 无条件终止
11 S I G S E G V 段(内存)冲突
1 5 S I G T E R M 软件终止(缺省杀进程信号)
还有信号0,我们前面在创建. l o g o u t文件时已经遇到过。该信号为“退出 s h e l l”信号。为了发出信号0,只要从命令行键入e x i t,或在一个进程或命令行中使用< C T R L - D >即可。
发送信号可以使用如下的格式:
kill [-signal no:| signal name] process ID
使用k i l l命令时不带任何信号或名字意味着使用缺省的信号 1 5。
可以使用如下的命令列出所有的信号:
# kill –l
5. 杀死一个进程
例如:
kill -9 157
或
kill -s SIGKILL 157
在有些系统中,不必使用- s,例如:kill SIGKILL 157。
6. 检测信号
在编写s h e l l脚本时,只需关心信号1、2、3和1 5。当脚本捕捉到一个信号后,它可能会采取下面三种操作之一:
1) 不采取任何行动,由系统来进行处理。
2) 捕获该信号,但忽略它。
3) 捕获该信号,并采取相应的行动。
7.trap
t r a p可以使你在脚本中捕捉信号。该命令的一般形式为:
trap name signal(s)
其中,n a m e是捕捉到信号以后所采取的一系列操作。实际生活中, n a m e一般是一个专门用来处理所捕捉信号的函数。N a m e需要用双引号( “ ” )引起来。S i g n a l就是待捕捉的信号。
脚本在捕捉到一个信号以后,通常会采取某些行动。最常见的行动包括:
1) 清除临时文件。
2) 忽略该信号。
3) 询问用户是否终止该脚本的运行。
下表列出了一些最常见的t r a p命令用法:
trap "" 2 3 忽略信号2和信号3,用户不能终止该脚本
trap"commands" 2 3 如果捕捉到信号2或3,就执行相应的c o m m a n d s命令
trap 2 3 复位信号2和3,用户可以终止该脚本
也可以使用单引号( ‘’ )来代替双引号( “” );其结果是一样的。
#!/bin/sh
Trap “my_exit” 2
LOOP=0
My_exit()
{
Echo “you just hit <CTRL-C>, at number $LOOP”
Echo “I will now exit”
Exit 1
}
While :
Do
LOOP=’`expr $LOOP + 1`
Echo $LOOP
Done
8. 忽略信号
忽略信号的一般格式为(信号9除外) :
trap""signal no:(s)
注意,在双引号之间没有任何字符,为了重新回到捕捉信号的状态,可以使用如下的命
令:
trap"do something" signal no:(s)
下面我们来总结一下上述方法。
trap ""1 2 3 15:忽略信号。
关键性的处理过程
trap"my_exit" 1 2 3 15:重新回到捕捉信号的状态,在捕捉到信号后调用 m y _ e x i t函数。
9. eval
e v a l命令将会首先扫描命令行进行所有的置换,然后再执行该命令。该命令适用于那些一
次扫描无法实现其功能的变量。该命令对变量进行两次扫描。这些需要进行两次扫描的变量
有时被称为复杂变量。不过我觉得这些变量本身并不复杂。
e v a l命令也可以用于回显简单变量,不一定是复杂变量。
$ NAME=Honeysuckle
$eval echo $NAME
Honeysuckle
执行含有字符串的命令:
$MYFILE=”cat testfile”
$echo $MYFILE
Cat testfile
$eval $MYFILE
Maydate, Maydate
Go down
从上面的结果可以看出,使用e v a l命令不但可以置换该变量,还能够执行相应的命令。第一次扫描进行了变量置换,第二次扫描执行了该字符串中所包含的命令 cat testf。
10. logger命令
系统中含有相当多的日志文件。其中的一个日志文件叫作 m e s s a g e s,它通常位于/ v a r / a d m或/ v a r / l o g目录下。一个名为s y s l o g的配置文件可以用来定义记录在m e s s a g e s文件中的消息,这些消息有一定的格式。如果想知道系统中的相应配置,可以查看 / e t c / s y s l o g . c o n f文件。该文件中包含了用于发送各种不同类型消息的工具及它们的优先级。
l o g g e r命令的一般形式为:
logger -p -I message
其中:
- p:为优先级,这里只涉及到提示用户注意的优先级,这也是缺省值。
- i:在每个消息中记录发送消息的进程号。
可以使用如下命令:
$ logger –p notice “This is a test message.Please Ignore $LOGNAME”
可能需要等几分钟才能看到该消息被记录到 m e s s a g e文件中。
$ tail /var/adm/messages
…
…
Jun 17 10:36:49 acers6 dave:This is a test message.Please Ignore dave