输入和输出
标准文件描述符
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