当前位置: 技术问答>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》两处的“>”,为什么会有不一样的“覆盖”效果呢?
谢谢!!
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一个月,不知说得对不对?请高手斧正!
>表示输出结果到目标文件,覆盖目标文件内容
>>表示输出结果到目标文件,将输出结果扩充在目标文件的结束处,但不覆盖目标文件内容
第二个问题:
可以通过设置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中。
其中,重定向符“>”,会使得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,两个是不相干的输出,输出的位置也不是一个文件,那里会出生覆盖的事情
但是,在这条命令里面,是把正常显示的内容保存到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")
假如程序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
做比较。
对于可执行程序使用“〉”重定向,只会调用一次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
做比较。