Chinaunix首页 | 论坛 | 博客
  • 博客访问: 386282
  • 博文数量: 124
  • 博客积分: 2911
  • 博客等级: 少校
  • 技术积分: 1050
  • 用 户 组: 普通用户
  • 注册时间: 2010-05-15 15:57
文章分类

全部博文(124)

文章存档

2012年(6)

2011年(26)

2010年(92)

我的朋友

分类: LINUX

2010-05-27 21:40:50

trap 语句的语法是这样的:

trap [COMMANDS] [SIGNALS]

意味着 trap 命令会捕捉在 SIGNALS 列出的可能带有或者没有 SIG 前缀的信号,或者信号数字。如果一个信号是 0 或者 EXIT, 那么 COMMANDS 在shell退出时候执行。如果其中一个信号是 DEBUGCOMMANDS 列表在每个简单命令后执行。一个信号也可以指定为 ERR;这样的情况下 COMMANDS 在每次一个简单命令以非零状态退出时执行。注意这些命令不会在非零退出状态来自一个 if 语句时执行,或者来自一个 while 或者 until 循环。如果一个逻辑 AND (&&) 或者 OR (||) 出现在非零退出状态中,所有都不会执行,或者当一个命令的退出状态使用 ! 操作符进行取反。

除非遭遇一个非法的信号,否则 trap 命令的返回状态是0。trap 命令带一组选项,在Bash的info页面中有记录。

这里有个非常简单的例子,从用户处捕捉 Ctrl+C, upon which a message is printed. 当你尝试着不指定 KILL 信号来杀掉这个程序时,什么都不会发生:

#!/bin/bash
# traptest.sh

trap "echo Booh!" SIGINT SIGTERM
echo "pid is $$"

while : # This is the same as "while true".
do
sleep 60 # This script is not really doing anything.
done

Bash怎样解释陷阱

每当Bash收到一个预先设置等待命令完成的陷阱的信号,在命令结束之前,陷阱不会执行。当Bash通过内建的命令 wait 来等待一个异步的命令,陷阱已经发送的信号的接受会导致内建的 wait 立即在陷阱执行后返回一个大于128的推出状态。

检测一个已经使用的变量

每当调试较长的脚本的时候,你可能想给于一个变量 trace 属性和陷阱的 DEBUG 信息。通常你会像这样 VARIABLE=value来 给变量赋值。用下面的几行来代替变量的声明可能会为你脚本的行为提供非常有价值的信息:

declare -t VARIABLE=value

trap "echo VARIABLE is being used here." DEBUG

# rest of the script

在退出的时候清理垃圾

whatis 命令依靠由cron执行 makewhatis.cron 生成的数据库:

#!/bin/bash

LOCKFILE=/var/lock/makewhatis.lock

# Previous makewhatis should execute successfully:

[ -f $LOCKFILE ] && exit 0

# Upon exit, remove lockfile.

trap "{ rm -f $LOCKFILE ; exit 255; }" EXIT

touch $LOCKFILE
makewhatis -u -w
exit 0

=================================================================================
通常shell变量是局部变量,无论是通过赋值操作还是通过命令赋值,其变量值只在当前进程中有效。
不过经过export语句说明的shell变量就成为一个全局性变量,其变量名和变量值能传递给
子进程及其后代进程。在子进程中能修改这个变量的值,但并不影响这个变量在父进程中的取值。

=================================================================================
source:
source命令即点(.)命令。

在bash下输入man source,找到source命令解释处,可以看到解释"Read and execute commands from
filename in the current shell environment and
..."。从中可以知道,source命令是在当前进程中执行参数文件中的各个命令,而不是另起子进程(或sub-shell)。
阅读(1194) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~