博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
标准输入输出重定向
阅读量:4693 次
发布时间:2019-06-09

本文共 1228 字,大约阅读时间需要 4 分钟。

程序会在运行中输出日志,并是通过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并且解决了两者缓冲区不一致的问题。

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

你可能感兴趣的文章
单片机状态机实现
查看>>
《嵌入式Linux基础教程学习笔记一》
查看>>
通用窗口类 Inventory Pro 2.1.2 Demo1(上)
查看>>
【小白的CFD之旅】19 来自计算网格的困惑
查看>>
将Winform程序快速转换为在浏览器中运行的程序
查看>>
dfhg发过火刚开始
查看>>
APIO2010 特别行动队
查看>>
super关键字
查看>>
多线程爬虫实现(下)
查看>>
GraphQL(二):GraphQL服务搭建
查看>>
JS中的函数浅析
查看>>
干货 | LVS虚拟服务器简介
查看>>
包教不包会系列-javascript 原型链与继承
查看>>
Python学习教程:玩转树莓派—搭建属于自己的云盘服务
查看>>
Python学习教程:用Python做一个三阶拼图
查看>>
关于OI中的各种数学(持续更新)
查看>>
Codeforces 1203F2. Complete the Projects (hard version)
查看>>
P3158 [CQOI2011]放棋子
查看>>
Codeforces 1220B. Multiplication Table
查看>>
P3153 [CQOI2009]跳舞
查看>>