‘壹’ 写一个shell如何将标准输出重定向到dev/null
用输出重定向符号> 即可,格式如下:
shell命令 >/dev/null
若要将标准错误输出也一并重定向,如下:
shell命令 >/dev/null 2>&1
这样就不管命令执行成功还是失败,都不会有任何信息打印到屏幕。
‘贰’ linux shell中关于输入重定向的问题
重定向就是这样的,命令的结果只能输出到一个地方,了解原理就可以理解了。
在 IO Redirection 中,stdout 或 stderr 的管道总是会先准备好,然后才将命令执行结果给导入。
你给的例子中,先重定向到/111.txt,再重定向到/222.txt,因此管道最终是接入了/222.txt。stdout只有一根管道,输入端是固定的,你只是在不停地移动输出端,当然是以最后的为准啦。
建议你去看看《Shell十三问》,里面有关于 IO Redirection 的详细解释。
解决方法就是用 tee 命令:
ls -l | tee /111.txt > /222.txt
‘叁’ 如何在一个shell程序中取消重定向
shell脚本中取消重定向的方法实例
这篇文章主要介绍了shell脚本中取消重定向的方法实例,本文直接给出代码实例,需要的朋友可以参考下
在上一篇关于shell编程的例子中,有讲到把shell脚本进行扩展之后重定向到一个文件中,以便进行查看和调试http://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脚本中>/dev/null的含义
/dev/null表示空设备,这里就是把日志记录到空设备里,就是不记录日志,Null 是一特殊指标值(或是一种物件参照 reference)表示这个指标并不指向任何的物件。
是一个特殊的文件,写入到它的内容都会被丢弃,如果尝试从该文件读取内容,那么什么也读不到,但是/dev/null 文件非常有用,将命令的输出重定向到它,会起到”禁止输出“的效果。
(4)shell脚本错误重定向扩展阅读:
用处:禁止标准输出
1 cat $filename >/dev/null # 文件内容丢失,而不会输出到标准输出,禁止标准错误。
2、dev/null 这样错误信息[标准错误]就被丢的不知道到哪了。
3、1>/dev/null 2>&1的含义> 代表重定向到哪里,例如:echo "123" > /home/123.txt1 表示stdout标准输出,系统默认值是1,所以">/dev/null"等同于"1>/dev/null"2表示stderr标准错误& 表示等同于的意思。
4、2>&1,表示2的输出重定向等同于1那么本文标题的语句1>/dev/null 首先表示标准输出重定向到空设备文件,也就是不输出任何信息到终端,说白了就是不显示任何信息。
5、2>&1 接着,标准错误输出重定向等同于 标准输出,因为之前标准输出已经重定向到了空设备文件,所以标准错误输出也重定向到空设备文件。
6、/dev/zero文件代表一个永远输出 0的设备文件,使用它作输入可以得到全为空的文件。因此可用来创建新文件和以覆盖的方式清除旧文件。
参考资料来源:
null值-网络
shell脚本-网络
‘伍’ shell脚本查询和重定向问题
var=`cat /root/kittytest/sendmail/temporary/interceptsum.txt|awk '{print $i}`
??
‘陆’ shell脚本重定向的问题。
>>比较好理解,是将某个命令的输出以追加方式重定向到文件,>则是先清空文件内容,再放入新文件。
cat <<EOF 中 的 EOF是文件分界符号,即在这个符号之前的内容认为是一个文件,EOF是End of file,是常用的文件分界符号,也可以用其他几个字符代替。
cat命令默认用法是 cat + 文件(输入) 其输出是文件内容,输出位置是标准输出(屏幕)。这里没有文件, <<EOF 可以想成一个特殊文件,它是由下面的文字直到EOF直接的内容组成的文件。
而<是本来需要屏幕输入的内容 从文件直接读取,和<<的意思差不多,(就好像 >和>>差不多一样)区别是:<后面是文件名,<<后面 是个代表文件分界的符号。
命令可以这样写: cat <<EOF >> $outfile
或cat <fileName1 >>fileName2 (文件1内容追加到文件2)