什么是linux的标准linux 屏蔽错误输出出

温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!&&|&&
少壮不努力,老大搞IT
LOFTER精选
网易考拉推荐
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
阅读(4959)|
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
历史上的今天
loftPermalink:'',
id:'fks_',
blogTitle:'Linux shell 重定向标准错误输出',
blogAbstract:'转自:/art/57.htm第5章介绍了标准输出的概念,并解释了如何重定向命令的标准输出。除了标准输出之外,命令还可以将输出发送到标准错误输出。命令将错误消息发送到标准错误输出,这样就可以避免与发送到标准输出的信息混淆在一起。与处理标准输出一样,默认情况下,shell将命令的标准错误输出发送到屏幕上。除非重定向标准输出和标准错误输出中的某一个,否则不能区分命令的输出到底是标准输出还是标准错误输出。本节讲述Bourne Again Shell使用的语法。如果使用TC Shell,请参见第9.3.4节。',
blogTag:'',
blogUrl:'blog/static/0',
isPublished:1,
istop:false,
modifyTime:0,
publishTime:0,
permalink:'blog/static/0',
commentCount:0,
mainCommentCount:0,
recommendCount:1,
bsrk:-100,
publisherId:0,
recomBlogHome:false,
currentRecomBlog:false,
attachmentsFileIds:[],
groupInfo:{},
friendstatus:'none',
followstatus:'unFollow',
pubSucc:'',
visitorProvince:'',
visitorCity:'',
visitorNewUser:false,
postAddInfo:{},
mset:'000',
remindgoodnightblog:false,
isBlackVisitor:false,
isShowYodaoAd:false,
hostIntro:'少壮不努力,老大搞IT',
hmcon:'0',
selfRecomBlogCount:'0',
lofter_single:''
{list a as x}
{if x.moveFrom=='wap'}
{elseif x.moveFrom=='iphone'}
{elseif x.moveFrom=='android'}
{elseif x.moveFrom=='mobile'}
${a.selfIntro|escape}{if great260}${suplement}{/if}
{list a as x}
推荐过这篇日志的人:
{list a as x}
{if !!b&&b.length>0}
他们还推荐了:
{list b as y}
转载记录:
{list d as x}
{list a as x}
{list a as x}
{list a as x}
{list a as x}
{if x_index>4}{break}{/if}
${fn2(x.publishTime,'yyyy-MM-dd HH:mm:ss')}
{list a as x}
{if !!(blogDetail.preBlogPermalink)}
{if !!(blogDetail.nextBlogPermalink)}
{list a as x}
{if defined('newslist')&&newslist.length>0}
{list newslist as x}
{if x_index>7}{break}{/if}
{list a as x}
{var first_option =}
{list x.voteDetailList as voteToOption}
{if voteToOption==1}
{if first_option==false},{/if}&&“${b[voteToOption_index]}”&&
{if (x.role!="-1") },“我是${c[x.role]}”&&{/if}
&&&&&&&&${fn1(x.voteTime)}
{if x.userName==''}{/if}
网易公司版权所有&&
{list x.l as y}
{if defined('wl')}
{list wl as x}{/list}关于linux下C标准输出的问题?
#include&stdio.h&
int main()
write(stdout,&hahhh&,6);
./a.out运行,结果没有任何反应。。。
#include&stdio.h&
int main()
write(1,&hahhh&,6);
} 结果就在屏幕上输出hahhh了,为什么会这样?
他们不是一样的吗
【1】man 3 stdout我们得到以下部分输出:
#include &stdio.h&
extern FILE *
extern FILE *
extern FILE *
从上面我们可以看到stdout的类型是FILE *
【2】man 3 write我们得到以下部分输出:
#include &unistd.h&
ssize_t pwrite(int fildes, const void *buf, size_t nbyte,
off_t offset);
ssize_t write(int fildes, const void *buf, size_t nbyte);
我们看到write(...)函数的头文件为unistd.h,且第一个参数的类型为int
【3】楼主帖子中的第一种方式
#include&stdio.h&
int main()
&&&&write(stdout,&hahhh&,6);
&&&&return 0;
结合【1】中stdout的类型为FILE *以及【2】中的write(...)的第一个参数为int,所以在实际运行的时候,会将FILE *类型强制转换为int,而(int)stdout的结果为:-(不同的机器结果可能不一样)
write(stdout,&hahhh&,6);
write(-,&hahhh&,6);
且我们知道STDOUT_FILENO为1,所以我们在屏幕上看不到任何的输出;
另外,如果我们加上-Wall参数进行编译,会得到如下的警告信息:
warning: passing argument 1 of ‘write’ makes integer from pointer without a cast [enabled by default]
write(stdout, &hahhh&, 6);
这条警告的大致意思是write函数的第一个参数直接将指针赋值给整数;
【4】楼主帖子中的第二种方式:
#include&stdio.h&
int main()
&&&&write(1,&hahhh&,6);
&&&&return 0;
当我们用gcc命令并加上-Wall编译后得到下面的警告信息:
warning: implicit declaration of function ‘write’ [-Wimplicit-function-declaration]
write(stdout, &hahhh&, 6);
出现这个警告的原因是从【2】我们看到write(...)的头文件是&unistd.h&,所以务必加上#include &unistd.h&
另外1为STDOUT_FILENO即标准输出,所以在屏幕上看到了我们所期望的输出。
Q:相信大家看到这里的时候,会发现一个问题,那就是为什么上面的代码中没有加&unistd.h&这个头文件,我们的程序依然可以运行,惟独只有编译的时候的跳出的一个警告信息。
我们先来了解一下基本的链接知识:
当gcc编译*.c文件的时候,如果发现某函数(如test())未定义或声明,编译器并未报错而只是提出警告,警告的信息一般如下:
warning: implicit declaration of function ‘test’ [-Wimplicit-function-declaration]
编译器默认该函数会在其他的模块中定义,在链接阶段,如果还未找到该函数定义则报链接错误,一般错误信息如下:
undefined reference to `test'
collect2: error: ld returned 1 exit status
所以针对上面提出的问题,源程序中即使没有包含&unistd.h&头文件,同样可以编译通过。那为什么可以链接成功呢?
我们运行ldd a.out可以看到a.out依赖的动态链接库如下所示:
linux-vdso.so.1 =&
(0x00007fff1d7fe000)
libc.so.6 =& /lib64/libc.so.6 (0xbce00000)
/lib64/ld-linux-x86-64.so.2 (0x0000)
从上面输出的结果,我们看到了大名鼎鼎的libc.so.6即libc动态链接库,我们从wikipedia中得到glic如下描述:
glibc provides the functionality required by the Single UNIX Specification, POSIX (1c, 1d, and 1j) and some of the functionality required by ISO C99, Berkeley Unix (BSD) interfaces, the System V Interface Definition (SVID) and the X/Open Portability Guide (XPG), Issue 4.2, with all extensions common to XSI (X/Open System Interface) compliant systems along with all X/Open UNIX extensions. In addition, glibc also provides extensions that have been deemed useful or necessary while developing GNU.
In the C and C++ programming languages, unistd.h is the name of the header file that provides access to the POSIX operating system API.
从上面的描述,我们可以看到glic实现了single unix specificaton, POSIX等功能,且我们了解到unistd.h是POSIX API的头文件。
至此,我们得到libc中实现了&unistd.h&中定义的所有函数当然包括我们程序中用到的write(...)函数,所以链接过程不会出错,程序能够正常运行。
man 命令的不同section的具体含义如下:
Description
&functions, covering in particular the&
&(usually devices, those found in /dev) and&
&and conventions
Miscellanea
System administration&&and&
man 3为直接查看c标准库
unistd.h中的unistd表示unix standard方便大家记忆
如上述分析有错误之处,还望各位不吝指出,谢谢!
STDOUT_FILENO 不是 stdout
这个是File&Descriptor
--- 共有 1 条评论 ---
gcc编译时带上-Wall 参数,write的头文件是#include &unistd.h& .加上头文件和-Wall参数就知道为什么了。
passing argument 1 of 'write' makes integer from pointer without a cast [enabled by default]
stdout是一个FILE指针
write的第一个参数是文件描述符,所以对应标准输出应该是STDOUT_FILENO
引用来自“杨同学”的答案 stdout是一个FILE指针
write的第一个参数是文件描述符,所以对应标准输出应该是STDOUT_FILENO 是的 看书不认真啊
很奇怪。能折腾这个问题的,应该会查资料了。。。。哈。
详细的分析可参考Linux shell的标准输入、输出和错误
Linux shell的标准输入、输出和错误
发布时间: 4:21:27
编辑:www.fx114.net
本篇文章主要介绍了"Linux shell的标准输入、输出和错误",主要涉及到Linux shell的标准输入、输出和错误方面的内容,对于Linux shell的标准输入、输出和错误感兴趣的同学可以参考一下。
转载来源:人生如棋CSDN博客
1.文件描述符
在linux shell执行命令时,每个进程都和三个打开的文件相联系,并使用文件描述符来引用这些文件。由于文件描述符不容易记忆,shell同时也给出了相应的文件名:
文件描述符
输入文件—标准输入
0(缺省是键盘,为0时是文件或者其他命令的输出)
输出文件—标准输出
1(缺省是屏幕,为1时是文件)
错误输出文件—标准错误
2(缺省是屏幕,为2时是文件)
系统中实际上有12个文件描述符,我们可以任意使用文件描述符3到9.
2.文件重定向:改变程序运行的输入来源和输出地点
2.1.输出重定向:
Command & filename
把标准输出重定向到一个新文件中
Command && filename
把标准输出重定向到一个文件中(追加)
Command & filename
把标准输出重定向到一个文件中
Command & filename 2&&1
把标准输出和错误一起重定向到一个文件中
Command 2 & filename
把标准错误重定向到一个文件中
Command 2 && filename
把标准输出重定向到一个文件中(追加)
Command && filename2&&1
把标准输出和错误一起重定向到一个文件(追加)
2.2.输入重定向:
Command & filename & filename2
Command命令以filename文件作为标准输入,以filename2文件作为标准输出
Command & filename
Command命令以filename文件作为标准输入
Command && delimiter&
从标准输入中读入,知道遇到delimiter分界符
2.3.绑定重定向
Command &&m
把标准输出重定向到文件描述符m中
Command & &-
关闭标准输入
Command 0&&-
3.shell重定向的一些高级用法
3.1.重定向标准错误
command 2& /dev/null
如果command执行出错,将错误的信息重定向到空设备
command & out.put 2&&1
将command执行的标准输出和标准错误重定向到out.put(也就是说不管command执行正确还是错误,输出都打印到out.put)。
3.2.exec用法
exec命令可以用来替代当前shell;换句话说,并没有启动子shell,使用这一条命令时任何现有环境变量将会被清除,并重新启动一个shell(重新输入用户名和密码进入)。
exec command
其中,command通常是一个shell脚本。
对文件描述符操作的时候用(也只有再这时候),它不会覆盖你当前的shell
#!/bin/bash
#file_desc
exec 3&&0 0&name.txt
read line1
read line2
echo $line1
echo $line2
首先,exec 3&&0 0&name.txt的意思是把标准输入重定向到文件描述符3(0表示标准输入),然后把文件name.txt内容重定向到文件描述符0,实际上就是把文件name.txt中的内容重定向到文件描述符3。然后通过exec打开文件描述符3;
然后,通过read命令读取name.txt的第一行内容line1,第二行内容line2,通过Exec 0&&3关闭文件描述符3;
最后,用echo命令输出line1和line2。最好在终端运行一下这个脚本,亲自尝试一下。
exec 3&&test.
#打开test.sh可读写操作,与文件描述符3绑定
while read line&&3
& & echo $
#循环读取文件描述符3(读取的是test.sh内容)
#关闭文件的,输入,输出绑定
一、不得利用本站危害国家安全、泄露国家秘密,不得侵犯国家社会集体的和公民的合法权益,不得利用本站制作、复制和传播不法有害信息!
二、互相尊重,对自己的言论和行为负责。
本文标题:
本页链接:

我要回帖

更多关于 linux 标准输出重定向 的文章

 

随机推荐