常见的文件描述符有stdin、stdout、stderr。他们是与文件输入输出相关联的整数。由系统预留其对关联关系有:
0-----stdin(标准输入)
1-----stdout(标准输出)
2-----stderr(标准错误)
当我们在字符界面下使用命令,当命令运行出错时,一般会在界面显示,但当执行shell脚本时,我们一般不希望将错误显示在界面中,一般是将其重定项到其他文件中,如日子文件,就是最好的记录shell执行过程信息。
当我们使用ls +时,由语法格式错误,界面会给出出错提示:
刚开始学习时碰到一个郁闷的问题,就是希望将错误信息重定向打印在日志文件中,于是弄了个重定向符上去,如:ls + >>test_log,以为会将错误信息打入到test_log文件中,于是满心欢喜的跑了一下,实际结果倒是:
结果依然呐,固执得很,由于刚学习嘛,对单纯的想法也不能太苛刻了,但是还是想要解决的,于是励志学好重定向,当了解到了这三种描述符,发现,事情原来就是那么简单,将命令改改就ok了,改成ls + 2>>test_log,跑起来非常顺畅。注意2,这就是标准错误描述符,由于系统默认是标准输出,故:ls + >>test_log无法将错误打入日子中,该语法还原格式为:ls + 1>>test_log
在学习时还捡了一点其他知识,就是命令执行后的结果状态信息,很简单,无非就是成功和不成功嘛。这个状态值非常有用,至少我发现在shell脚本中运行时要打印状态信息时,这个值用来做逻辑判断实在是太幸福了。(解释:当命令执行成功是结果状态值是0,非0则表示执行失败,用变量$?来获得当前结果状态值)
如在实现文件复制时,判断该复制是否成功了的判断语句实现起来就比较简单了,在判断中将信息定向到结果日志中,如下简单语句:
cp -f $OldFilePath/test1 $NewFilePath/test1 2>>$Testlog/log_txt #若是执行失败,则将错误重定向到日子文件中去
if [ $? -e 0 ]
then
time_now_2=`date +%Y-%m-%d" "%H:%M:%S`
echo $time_now_2 '替换完成'>>$Testlog/log_txt
else
time_now_2=`date +%Y-%m-%d" "%H:%M:%S`
echo $time_now_2 '替换失败'>>$Testlog/log_txt