Linux命令行与shell脚本编程大全(三)

十二、呈现数据

输入和输出

    标准文件描述符

                 0 STDIN 标准输入

                 1 STDOUT 标准输出

                 2 STDERR 标准错误

    重定向错误

                  1.只重定向错误

 ls -al badfile 2>test1         ##2>表示只重定向错误

                  2.重定向错误和数据

ls -al test test2 test3 badtest 2>test4 1>test5

### 2>表示将错误重定向到test4文件,1>表示将标准输出重定向到test5文件

ls -al test test3 test4 badtest &> test7

### &>会将所有的输出发送到同一个文件,包括错误和数据


在脚本中重定向输出

1.临时重定向

使用输出重定向符来讲输出信息重定向到STDERR文件描述符。在重定向到文件描述符时,必须在文件描述符数字前加一个&

2. 永久重定向

使用exec命令告诉shell在脚本执行期间重定向某个特定文件描述符。

## 临时重定向,使用&
echo "this is an error" >&2
echo "this is normal output"

## 永久重定向,使用exec命令
exec 2>testerror #重定向标准错误
echo "this is the start of the script" ##正常在屏幕显示
echo "now redirecting all output to another location" ##同上


exec 1>testout ##重定向标准输出
echo "this is a test should go to testout file" ##在testout文件中
echo "this line should go to testerror file" >&2 ##在testerror文件中

在脚本中重定向输入

exec命令允许将STDIN重定向到Linux系统上的文件中。

exec 0

创建自己的重定向

## 1 创建输出文件描述符
exec 3>testout
echo "this should be stored in the file " >&3
echo "this should be on the screen"
## 2 重定向文件描述符
exec 3>&1  ##描述符3重定向为描述符1,即STDOUT
exec 1>testout  ##STDOUT重定向到文件
echo "this should store in the output file"
echo "along with this line"
exec 1>&3 ##STDOUT重定向到显示器
echo "now things should be back to normal"
## 3 创建输入文件描述符
exec 6<&0
exec 0
exec 3<>testfile
read line <&3
echo "read : $line"
echo "this is a test line." >&3
## 5 关闭文件描述符,使用&-,一旦关闭,在脚本就不能在使用
exec 3>&-

列出打开文件描述符

 

## 列出打开的文件描述符 lsof命令
## lsof -a -p $$ -d 0,1,2,3,4,5,6,7,8,9
exec 3>testfile1
exec 5

阻止命令输出

可以将STDERR重定向到一个叫做null文件的特殊文件,该文件位置为/dev/null

ls -al >/dev/null

创建临时文件

mktemp testing.XXXXXX

指定一个文件名模板,模板可以包含任意文本文件名,在文件名末尾加上6个X就可以了。mktemp命令会用6个字符替换这6个X,该文件在系统启动时不会被删除。-t选项会强制mktemp命令在系统的临时目录创建文件,使用这个选项,mktemp命令会返回临时文件的全路径,在/tmp目录中的文件会在系统启动时被删除。-d选项会创建一个临时目录

##创建临时文件
# 本地临时文件 mktemp testing.XXXXXX,mktemp会用6个字符替换这6个X,保证文件名在目录中是唯一的
# -t选项会强制mktemp命令在/tmp目录中创建文件,返回文件的全路径,该文件在系统启动时会被删除
# -d选项会创建一个临时目录
tempfile=$(mktemp test.XXXXXX)
exec 3>$tempfile
echo "This script writes to temp file $tempfile"
echo "This is the first line" >&3
echo "This is the second line" >&3
echo "This is the thrid line" >&3
exec 3>&-
echo "Done creating temp file.The contents are:"
cat $tempfile
rm -f $tempfile 2> /dev/null

记录消息

tee命令可以将输出同时发送到显示器和日志文件,命令格式: tee filename,-a选项会将数据追加到文件中

## 记录消息
# tee命令会将输出同时发送到显示器和日志文件,用法tee filename
# 例如: date | tee -a testfile
# -a选项会将数据追加到文件中

十三、控制脚本

处理信号

    1.Linux常用信号

                 信号                值                        描述

                 1               SIGHUP                挂起进程

                 2               SIGINT                  终止进程

                 3               SIGQUIT               停止进程

                 9               SIGKILL                无条件终止进程

                 15             SIGTERM             尽可能终止进程

                 17             SIGSTOP             无条件停止进程,但不是终止进程

                 18             SIGTSTP              停止或暂停进程,但不终止进程

                 19             SIGCONT             继续运行停止的进程

    2.生成信号: 中断进程 Ctrl+C 暂停进程 Ctrl+Z

##捕获信号 
trap commands signals

3.捕获脚本退出

trap commands EXIT

4.修改或移除捕获,如果一个信号在捕获被修改前接收到,脚本仍然会根据最初的trap命令进行处理。

## 使用trap捕获信号
trap "echo 'sorry,I have trapped ctrl-c'" SIGINT
count=1
while [ $count -le 10 ]
do
	echo "Loop #$count"
	sleep 1
	count=$[ $count + 1 ]
done
# 修改捕获,捕获脚本退出
trap "echo goodbye..." EXIT
# 移除捕获
trap -- SIGINT

以后台模式运行脚本

    1.后台运行脚本,在命令后加上 & 符就可以了,终端会话推出,后台进程也会随之退出。

    2.在非控制台下运行脚本,使用nohup命令

nohup ./test1.sh &

作业控制

    1.查看作业: jobs ,带加号的作业会被当作默认作业,带减号的作业为下一个默认作业,任何时候只有一个带加号的作业和一个带减号的作业

    2.重启停止的作业 :

后台模式重启: bg 加作业号

前台模式重启: fg 加作业号

调整谦让度

调度优先级从-20(最高优先级)到+19(最低优先级),默认情况下,shell以优先级0启动所有进程

1. nice命令让命令以更低的优先级运行,不能调高优先级:

nice -n 10 ./test4.sh> test4.out &(或者可以直接去掉n)

nice -10 ./test4.sh> test4.out &(直接去掉n)

2. renice命令:改变系统上已经运行命令的优先级

renice -n 10 -p 5055    ##(5055进程优先级调低到10)

# 只能对属于你的进程执行renice

# 只能通过renice降低进程的优先级

# root用户可以通过renice来任意调整进程的优先级(可以调高优先级)

定时运行作业

    1. at命令

    基本格式 at [-f filename] time

    时间格式: 标准的小时和分钟格式,如10:15

         AM/PM指示符,如10:15 PM

         特定可命名时间,如now,noon,midnight,teetime

         标准日期格式,如MMDDYY,MM/DD/YY或DD.MM.YY

         文本格式如Jul 4或Dec 25

         指定时间增量 当前时间+25min, 明天10:15pm,10:17+7天

    atq可以查看系统中有哪些作业在等待

    atrm可以删除等待中的作业

    2.需要定期执行的脚本

    -- cron时间表

    格式: min hour dayofmonth month dayofweek command1

    允许使用特定值、取值范围、或者通配符来指定条目。

   -- 构建cron时间表      crontab -l

   -- 浏览cron目录

    /etc/目录下有四个基本目录.hourly,daily,weekly,monthly,如果脚本需要每天运行一次,吧脚本复制到daily目录就可以了

   -- anacron程序

某作业由于关机错过了执行时间,anacron会尽快运行该作业,只会处理位于cron目录,一般在/etc/anacrontab文件中

格式 : period delay identifier command

peroid定义作业多久运行一次,以天为单位,identifier条目是一种特别的非空字符串,用于唯一标识日志错误和错误邮件中的作业。command条目包含了run-parts程序和一个cron脚本目录名。

使用新shell启动脚本

用户登录会按照顺序查找如下文件,当找到顺序值低的文件时,不再继续查找:

$HOME./bashrc,$HOME/.bash_profile,$HOME/.bash_login,$HOME/.profile

你可能感兴趣的:(Linux,shell脚本)