标准输入输出重定向

程序会在运行中输出日志,并是通过java的日志类进行输出的。而如果关掉SSH运行程序,就会丢失这些信息。直观的解决办法是将输出到控制台的日志重定向到文件中,于是我将命令改为:sh auto.sh > console.txt &。不过事实并没像我想的那样,console.txt虽然被创建了,而日志并没有写在其中。后来请教Robert Chen,他让我用sh auto.sh >console.txt 2>&1 & 命令试一下,我输入了这个隐晦的命令之后,原本输出到控制台的日志内容终于被重定向到console.txt了。

下面来详细分析一下这条命令:

sh auto.sh 运行shell脚本

>console.txt 将标准输出重定向到console.txt文件中

其实操作系统有三个常用的流:

0:标准输入流 stdin

1:标准输出流 stdout

2:标准错误流 stderr

一般当我们用 > console.txt,实际是 1>console.txt的省略用法;< console.txt ,实际是 0 < console.txt的省略用法。

java的日志类默认是输出到system.err中,所以要想将日志内容重定向到console.txt,需要将stderr重定向到console.txt.

将stderr重定向到console.txt的命令是 2 < console.txt。

不过有个问题,stdout是有缓冲的,而stderr是没有缓冲的,原因很简单,stderr一般是系统发生错误,比如编译一个程序出错,需要立即给出编译错误提示。

所以如果写成 sh auto.sh > console.txt 2 > console.txt就会出现问题。

再来看看 >& 操作符:

重定向操作符 描述

>


将命令输出写入到文件或设备(如打印机),而不是命令提示符窗口或句柄。


<


从文件而不是从键盘或句柄读入命令输入。


>>


将命令输出添加到文件末尾而不删除文件中已有的信息。


>&


将一个句柄的输出写入到另一个句柄的输入中。


<&


从一个句柄读取输入并将其写入到另一个句柄输出中。


|


从一个命令中读取输出并将其写入另一个命令的输入中。也称作管道。

而句柄的定义就是:

句柄 句柄的数字代号 描述

STDIN


0


键盘输入


STDOUT


1


输出到命令提示符窗口


STDERR


2


错误输出到命令提示符窗口


UNDEFINED


3-9


句柄由应用程序单独定义,它们是各个工具特有的

所以 2 >& 1就是把 stderr重定向到stdout 由于stdout被重定向到 console.txt,所以最终stderr,stdout均被重定向到console.txt并且解决了两者缓冲区不一致的问题。

java Test>test.txt 2>&1

转载:http://www.cnblogs.com/coolgestar02/archive/2011/01/04/1925590.html

时间: 2024-10-10 23:00:44

标准输入输出重定向的相关文章

C标准输入输出重定向

C中的标准输入输出可以进行重定向到文件. 示例程序:(C Primer Plus示例8.2) // echo_eof.c -- 重复输入,直到文件的结尾 #include <stdio.h> int main(void) { int ch; while ( (ch = getchar()) != EOF) putchar(ch); return 0; } 编译运行.在终端中运行: >echo_eof.exe 则标准输入输出为键盘和显示屏. 同样的,将标准输入重定向到文件echo_eof.

Mac 命令学习 - 标准输入输出重定向

预备知识 文件描述符( File Descriptor ) 在Unix 系统中文件描述符是用于访问文件.输入输出.管道.网络套接字的一个抽象概念[3].文件描述符是一个非负的正整数,每一个Unix进程中都会有三个与标准流所对应的的POSIX文件描述符,分别为: stdin - 标准输入,提供给应用的标准输入.文件描述符为0. stdout - 标准输出,程序的输出,在非重定向的情况下为终端.文件描述符为1. stderr - 标准错误输出,程序的错误输出.文件描述符为2. 关于文件描述符的详细,

linux 标准输入输出 重定向

背景: 屏幕打印不一定都是从标准输出来的,也包括标准错误输出流stderr中的信息 文件描述符定义(系统定义了12个) 0 标准输入 1 标准输出 2 标准错误 0 默认键盘输入 1,2默认从屏幕打印,可以重定向到其他文件 参考: 流,管道重定向[IBM]: http://www.ibm.com/developerworks/cn/linux/l-lpic1-v3-103-4/ 重定向执行顺序:http://blog.chinaunix.net/uid-25324849-id-3141027.h

管道重定向之重定向标准输入输出句柄

管道重定向之重定向标准输入输出句柄1.如果控制台应用程序数据流中包含中文,则要调用 _tsetlocale(LC_ALL, _T("chs")),否则数据流中的中文字符会被当成中止符而被截断,如printf("abc中文def"),只会输出"abc" 2.printf,cout,wcout中的换行符'\n',会被修改为回车加换行'\r\n'传递到管道中,如有语句printf("abc\r\n"),传递的真实数据流是"

标准输入输出,输出重定向

标准输入输出: 输出重定向: 正确输出和错误输出同时保存:  命令 &>/dev/null 这条指令把正确输出写入文件中,错误输出丢入黑洞 解释: 放在>后面的&,表示重定向的目标不是一个文件,而是一个文件描述符,内置的文件描述符如下 1 => stdout 2 => stderr 0 => stdin 换言之 2>1 代表将stderr重定向到当前路径下文件名为1的regular file中,而2>&1代表将stderr重定向到文件描述符

标准输入输出

标准输入输出和管道  三种输入和输出设备 把输出和输入重定向到文件 使用管道连接命令 一.标准: 输入(STDIN)-0,默认是键盘鼠标的输入窗口 输出(STDOUT)-1,默认设备当前终端窗口 错误(STDERR)-2,默认当前终端窗口 1: 打开的文件都有一个fd: file descriptor (文件描述符) 二,输入输出重定向:改变文件位置 1,> 把输出STDOUT重定向到文件 2>把STDERR重定向到文件    &>把所有输出重定向到文件      > 文件

CentOS下输入输出重定向

nux重定向是指修改原来默认的一些东西,对原来系统命令的默认执行方式进行改变,比如说简单的我不想看到在显示器的输出而是希望输出到某一文件中就可以通过Linux重定向来进行这项工作. Linux默认输入是键盘,输出是显示器.你可以用重定向来改变这些设置.比如用wc命令的时候本来是要手动输入一篇文字来计算字符数的,用了重定向后可以直接把一个已经写好的文件用‘<’指向这条命令,就直接可以统计这个文件的字符数等了.输出也是一样,你可以把屏幕输出重定向到一个文件里,再到文件里去看结果.重定向操作符可以用来

shell ——输入输出重定向

转自http://www.cnblogs.com/chengmo/archive/2010/10/20/1855805.html 在了解重定向之前,我们先来看看linux 的文件描述符. linux文件描述符:可以理解为linux跟踪打开文件,而分配的一个数字,这个数字有点类似c语言操作文件时候的句柄,通过句柄就可以实现文件的读写操作. 用户可以自定义文件描述符范围是:3-num,这个最大数字,跟用户的:ulimit –n 定义数字有关系,不能超过最大值. linux启动后,会默认打开3个文件描

输入输出重定向

0. C语言的标准输入输出 stdin stdout stderr 1. 重定向到文件 1 #include <stdio.h> 2 3 int main(){ 4 char a[100]; 5 if(1==0){ 6 freopen("data.txt","w",stdout); 7 printf("hello word"); 8 }else{ 9 freopen("data.txt","r"