当前位置:  技术问答>linux和unix

shell中“输出重定向”的“覆盖”问题

    来源: 互联网  发布时间:2016-07-08

    本文导语:  如题, 1》 有如下shell代码: for((i=0;i output done 其中,重定向符“>”,会使得10次输出的结果,最后只剩9; 如果,用“>>”可以累加所有10次输出。 2》 但,我发现, 有个程序运行时的命令行如下: ./prag >std.log...

如题,

1》
有如下shell代码:

for((i=0;i output

done

其中,重定向符“>”,会使得10次输出的结果,最后只剩9;

如果,用“>>”可以累加所有10次输出。

2》
但,我发现,
有个程序运行时的命令行如下:
./prag >std.log 2>err.log

其中的重定向符“>”,会保存该次运行的所有输出。
即,本次运行时的,后面的输出没有覆盖出现在前面的输出。

请问,上述1》和2》两处的“>”,为什么会有不一样的“覆盖”效果呢?
谢谢!!

|


你的意思是不是:

假如程序prog包括以下代码:
fprintf(stdout,"line xn");
fprintf(stdout,"line yn");

而line y没有覆盖line x


这个是由于>重定向符号fopen(filename,"w")打开文件,而>>是以fopen(filename,"a")打开文件。
在某一次fopen(filename,"w")时,相应的fclose之前的文件写操作都是顺序写的,根本不存在覆盖的说法。

|
第一个问题:
>表示输出结果到目标文件,覆盖目标文件内容
>>表示输出结果到目标文件,将输出结果扩充在目标文件的结束处,但不覆盖目标文件内容

第二个问题:
可以通过设置shell环境中的noclobber来保证>不会覆盖目标文件原来的内容

我刚学linux一个月,不知说得对不对?请高手斧正!

|
1》
   其中,重定向符“>”,会使得10次输出的结果,最后只剩9; 
没错肯定省9,因为i>”可以累加所有10次输出。 
没错肯定累加每一次输出因为从0开始满足小于10的整数有10个。
2》
   其中的重定向符“>”,会保存该次运行的所有输出。 
  即,本次运行时的,后面的输出没有覆盖出现在前面的输出。 
  运行顺序是这样的:
  ./prag >std.log 2>err.log 
./prag 程序所输出的字符串会 重定向输出到std.log 文件中 但是每一次执行该shell都会重写
而后面的err.log为什么会么有内容是因为 2> 是作为标准错误信息输出

才输入下:
0、1和2分别表示标准输入、标准输出和标准错误信息输出,
可以用来指定需要重定向的标准输入或输出,比如 2>a.txt 表示将错误信息输出到文件a.txt中。

|
楼上正解~~

就相当于一次运行的输出是一个整体一样

|
效果是一样的,1》是做了10次的覆盖,所以文件里的内容是最后一次的输出,而2》只做了1次覆盖,文件内容也就是本次运行的输出。

|
问问题的这个同学应该去学一下基本的LINUX SHELL知识

|
第2项里面的内容确实会因为第二次运行而覆盖
但是,在这条命令里面,是把正常显示的内容保存到std.log里面,报错内容保存到err.log,两个是不相干的输出,输出的位置也不是一个文件,那里会出生覆盖的事情

|
不会吧 ,我按你说的试了下,每次都覆盖之前的输出了啊

你说的“不会覆盖本次运行时的输出”是什么意思?

|
引用jiangxc2004:

假如程序prog包括以下代码: 
fprintf(stdout,"line xn"); 
fprintf(stdout,"line yn"); 

而line y没有覆盖line x 
。 

这个是由于>重定向符号fopen(filename,"w")打开文件,而>>是以fopen(filename,"a")打开文件。 
在某一次fopen(filename,"w")时,相应的fclose之前的文件写操作都是顺序写的,根本不存在覆盖的说法

//==========================================================================================
同意!

再说
1>>
echo 1 >output
echo 2 >output

2>>
./prog >log
根本没什么可比性

1>>调用了两次可执行程序,当然会覆盖
2>>调用了一次可执行程序,当然不会覆盖
也就说,1>>会调用两次fopen(filename,"w")
2>>只调用一次fopen(filename,"w")

|
是覆盖了的。你可以看一下 std.log 日志的时间

|
jiangxc2004,说的很明白了。
 
对于可执行程序使用“〉”重定向,只会调用一次fopen("std.log","w"),然后将写入标准输出的内容
依次写入文件内,直到程序退出时才会关闭文件

prog >log
相当于:
1.fp = fopen("std.log","w");
2.fput(fp,"aaa");
3.fput(fp,"bbb");
4.fclose(fp);

结果,文件内“aaabbbb”

echo aaa >out
echo bbb >out

结果,文件内“bbb”
相当于调用两次可执行程序,重定向两次,每次都会调用fopen("std.log","w");
第二次调用fopen("std.log","w");会清空原文件


所以,我说一个使用了一次重定向符,一个使用了两次重定向符,没有什么可比性。

你只能使用
echo aaa >out

prog >log
做比较,同样都是调用了一次重定向符
可惜echo这个可执行程序,只输出一次,不存在你说的后面的输出会覆盖前面的

至于你使用
echo aaa >out
echo bbb >out
只能和
prog >log
prog >log
做比较。

    
 
 

您可能感兴趣的文章:

  • 用shell变量保存命令输出。
  • shell脚本错误输出
  • shell调用c显示输出的问题
  • shell脚本中的awk命令,怎样输出第一个字段
  • 控制shell脚本输出的字节数
  • shell脚本输出重定向的问题
  • Shell 输出问题,如何取出其中的一条记录。(输出一条ip地址)
  • linux shell 获取输出值
  • Shell 如何输出date '+%Y%m%d'
  • c++如何逐行得到shell命令的输出
  • shell script 格式化输出
  • 请问,怎么把某个程序的输出赋给shell变量??
  • unix shell中能否将后台运行程序的输出保存到变量中?
  • shell中如何得到程序的输出值
  • shell $1的输出问题
  • 一个简单的转换输出的shell脚本代码
  • 编一个模拟shell实现的程序,怎么实现输入输出重定向?谢谢
  • 怎么实现shell中的输入输出重定向,谢谢!
  • 如何获取shell上的输出信息呢?
  • 请问如何在程序中获得shell命令输出的信息?
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 傻瓜问题,请问shell编程和shell脚本编程的关系
  • shell变量和子shell的问题请教
  • 请教 一个shell问题 如何通过shell获得一个日志文件中的增量部分
  • 在shell中的交互问题,现在需要在shell结束时按某键或任意键
  • 请教一个 shell 问题,我用下面这个 shell 语句总是失败,请教
  • 急救!关于Shell脚本删除过期文件的问题,Shell脚本达人乱入
  • 请教一个shell编程的问题,就是如何在shell编程中读一个文件的内容?谢谢啦!
  • 使用shell在文本文件中进行字符串搜索问题?shell高手请进,分不够可以再加
  • vim问题,怎么不启动shell窗口,而只是把shell结果放到vim自身的command 栏里去?
  • 刚学Shell编程,问个关于Shell中if语句的问题
  • shell:sql问题,如何shell循环将不同表数据写入文件中...
  • 求助关于Java调用shell再传值给shell的问题
  • 一个奇怪的shell问题
  • 有关裁减内核及shell命令的问题
  • HP机上shell运行问题!写了个环境设定的shell,怎么也运行不了,大家来看看!
  • 子shell路径问题
  • 初学者问题,Unix Shell
  • 求助!!shell调用问题
  • 内核执行shell命令问题
  • 关于shell的问题~~~
  • Centos6下安装Shell下文件上传下载rz,sz命令
  • 不同类型的shell*(K SHELL , C SHELL) 用命令怎么切换?
  • linux bash shell命令:grep文本搜索工具简介
  • 我在执行shell时,想在shell里直接向mysql数据库插入数据,我该如何写shell。
  • Linux下指定运行时加载动态库路径及shell下执行程序默认路径
  • 菜鸟问问题:shell是什么呢?普通的ls、cp、pwd这些命令算不算shell呢?如何把自己写的文件变成shell呢?
  • linux bash shell命令:文本搜索工具grep中用于egrep和 grep -E的元字符扩展集
  • 请问“当前shell”和“子shell”的区别?
  • linux bash shell命令:文本搜索工具Grep命令选项及实例
  • 怎么知道当前是B_SHELL 还是C_SHELL
  • linux bash shell命令:文本搜索工具grep正则表达式元字符集(基本集)


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3