脚本专栏 
首页 > 脚本专栏 > 浏览文章

shell脚本中取消重定向的方法实例

(编辑:jimmy 日期: 2025/2/25 浏览:3 次 )

在上一篇关于shell编程的例子中,有讲到把shell脚本进行扩展之后重定向到一个文件中,以便进行查看和调试https://www.jb51.net/article/62435.htm。但是,若是有另一种情况:只是在某些地方进行重定向,而其他地方不进行重定向。那么我们就来修改一下上一篇中的例子来进行这种需求的满足:
复制代码 代码如下:
#!/bin/bash
function setlogfile
{
    if ! [ -z "$1" ]; then
        echo "logfilename is not empty!" kthh
        exec 3>&1
        exec 4>&2
        exec 2 $1
        exec 1 $1
    fi   
}

num1=$1
logfile=$2
execlogfile=$3

setlogfile ${execlogfile}
set -x
if [ $num1 -eq 0 ]; then
    echo "num1 is 0" ${logfile}
elif [ $num1 -ge 0 ]; then
    echo "num1 is grate 0" ${logfile}
else
    echo "num1 is less 0" ${logfile}
fi
exec 2>&4
exec 1>&3
if [ $num1 -eq 0 ]; then
    echo "num1 is 0 again" ${logfile}
fi

在函数setlogfile中添加了exec 3>&1;exec 4>&2这两句,而其中,3、1、4、2都是表示文件描述符,1是标准输出,也即是STDOUT,2是标准错误输出,即是STDERR,1和2本来是输出在显示器上的,而3、4是表示两个文件描述符,可理解成是两个保存1和2的临时变量, 3>&1表示把文件描述符1的赋值给文件描述符3,也可以理解为是把文件描述符1(当前标准输出)的规则保存到了文件描述符3中,这时再把1的输出重定向到文件中,在下面的shell程序中,我们又使用了1>&3这就表示是把保存在文件描述符3中的原标准输出的规则重新赋值给文件描述符1,原来标准输出的规则是输出到显示器上,而不是输出到一个文件中。这就是整个重定向和取消重定向还原的过程。2和4也是一样的道理。

闲话少说,先看运行结果:
复制代码 代码如下:
[root@UFO shellprogram]# ./testexecutelog.sh 0 msglog execlog
+ exec
+ '[' 0 -eq 0 ']'
+ echo 'num1 is 0 again'

[root@UFO shellprogram]# cat execlog
+ '[' 0 -eq 0 ']'
+ echo 'num1 is 0'
+ exec

看到结果了吗??? 没看到么??? 那就仔细看了,^_^

上一篇:Shell脚本统计文件行数的8种方法
下一篇:实现android自动化测试部署与运行Shell脚本分享
一句话新闻
一文看懂荣耀MagicBook Pro 16
荣耀猎人回归!七大亮点看懂不只是轻薄本,更是游戏本的MagicBook Pro 16.
人们对于笔记本电脑有一个固有印象:要么轻薄但性能一般,要么性能强劲但笨重臃肿。然而,今年荣耀新推出的MagicBook Pro 16刷新了人们的认知——发布会上,荣耀宣布猎人游戏本正式回归,称其继承了荣耀 HUNTER 基因,并自信地为其打出“轻薄本,更是游戏本”的口号。
众所周知,寻求轻薄本的用户普遍更看重便携性、外观造型、静谧性和打字办公等用机体验,而寻求游戏本的用户则普遍更看重硬件配置、性能释放等硬核指标。把两个看似难以相干的产品融合到一起,我们不禁对它产生了强烈的好奇:作为代表荣耀猎人游戏本的跨界新物种,它究竟做了哪些平衡以兼顾不同人群的各类需求呢?