linux附加重定向,关于Linux:如何将stdout和stderr重定向并附加到带有bash的文件中?...

要将stdout重定向到bash中的截断文件,我知道要使用:

cmd > file.txt

要重定向bash中的stdout,附加到一个文件,我知道要使用:

cmd >> file.txt

要将stdout和stderr重定向到截断的文件,我知道要使用:

cmd &> file.txt

如何重定向附加到文件的stdout和stderr?埃多克斯一〔0〕没有为我工作。

我要注意,outfile是一个bash(和其他)特定的代码,不可移植。可移植的方法(类似于附加答案)始终是并且仍然是>outfile 2>1

cmd >>file.txt 2>&1

bash执行从左到右的重定向,如下所示:

>>file.txt:在追加模式下打开file.txt,重定向stdout。

2>&1:将stderr改为"stdout目前的发展方向"。在本例中,这是以追加模式打开的文件。换句话说,&1重用了stdout当前使用的文件描述符。

工作很棒!但是有没有一种方法可以解释这个问题,或者我应该把它当作一个原子bash构造来处理?

这是一个简单的重定向,重定向语句总是从左到右进行计算。>文件:红色。标准输出到文件(附加模式)(1>>文件的缩写)2>>&1:红色。stderr to"where stdout goes"注意"redirect stderr to stdout"的解释是错误的。

它表示"将输出(stdout,文件描述符1)附加到file.txt,并将stderr(文件描述符2)发送到与fd1相同的位置"。

@但是,如果我需要将stderr重定向到另一个文件,但要附加文件呢?这有可能吗?

如果你这样做,它应该达到你想要的。

hum@thebonsai和其他用户的评论对我来说似乎很清楚,但是:来自:cron-subject(…)-message:EDOCX1(每小时一次)。stderr是否排除segfault?

@彭赛-我也在试图理解命令背后的原因。您以前的解释非常有用,但是请您通过以下内容详细说明一下:为什么"cmd>>file.log 2>>&1"将(通过附加)stderr重定向到stdout所在的位置,而"cmd>>file.log 2>>&1"将(到截断的文件)stderr重定向到stderr所在的位置?

@穆罕默德胡辛巴?我?:你第一个使用2>>&1的机器不工作。这不是重定向,而是复制文件描述符。因为您在附加模式下将stdout重定向到一个文件,所以您要将该fd复制到stderr,使其处于同一模型中。2>&1是正确的。

这不是抑制了stdin吗?如何使用此选项保持程序的stdin活动?例如,如果我有一个Java程序,可以读取用户输入,它的STDUT和STD错误,我想重定向到日志?

@克里斯特:这个命令根本不影响stdin。但是,用户自然不会看到Java程序的输出,因为它会转到一个文件而不是终端。如果你想两者兼得,你需要使用tee。

根据您的bash版本,有两种方法可以做到这一点。

经典的便携式(bash pre-4)方法是:

cmd >> outfile 2>&1

一个不可移植的方法,从bash 4开始是

cmd &>> outfile

(模拟&> outfile)

为了获得良好的编码风格,您应该

决定是否需要考虑可移植性(然后使用经典方法)

决定是否需要考虑可移植性,即使是bash pre-4(然后使用经典方法)

无论使用哪种语法,都不要在同一个脚本中更改它(混淆!)

如果您的脚本已经以#!/bin/sh开头(无论是否有意),那么bash 4解决方案,以及通常任何bash特定的代码,都不是解决方案。

还要记住,bash 4 &>>只是较短的语法——它不引入任何新功能或类似的功能。

这里描述的语法(除了其他重定向语法之外):http://bash hacker.org/wiki/doku.php/syntax/redientation appending_rediented_output_and_error_output

我更喜欢&>>,因为它与&>和>>一致。"将输出和错误附加到此文件"比"将错误发送到输出,将输出附加到此文件"更容易读取。注意,虽然Linux通常具有bash的当前版本,但在编写时,OS X仍然需要通过自制等手动安装bash 4。

我更喜欢它,因为它较短,每行只有两个位置,所以zsh会用"&>>"做什么?

同样需要注意的是,在cron作业中,即使系统有bash4,也必须使用pre-4语法。

@zsero cron根本不使用bash…它使用sh。您可以通过将SHELL=/bin/bash预先附加到crontab -e文件来更改默认shell。

在bash中,您还可以显式地指定重定向到不同的文件:

cmd >log.out 2>log_error.out

附录将是:

cmd >>log.out 2>>log_error.out

使用第一个选项将两个流重定向到同一个文件将导致第一个流在第二个流的顶部写入,覆盖部分或全部内容。使用cmd>>log.out 2>log.out代替。

谢谢你接住了,你说得对,一个会打倒另一个。但是,您的命令也不起作用。我认为写入同一个文件的唯一方法是像在cmd >log.out 2>&1之前那样。我正在编辑我的答案以删除第一个示例。

在bash 4(以及zsh 4.3.11)中:

cmd &>>outfile

刚出盒

@Aoeaoe:这实际上也适用于bash4。

@所有:这是一个很好的答案,因为它与bash一起工作并且很简短,所以我已经编辑了以确保它明确地提到bash。

@Mikemacana:Thebonsai的答案显示了自2009年以来的bash4解决方案

这应该很有效:

your_command 2>&1 | tee -a file.txt

它将所有日志存储在file.txt中,并将其转储到终端上。

试试这个

You_command 1>output.log  2>&1

您对&>x.file的使用确实适用于bash4。对不起:(这里有一些额外的提示。

0、1、2…9是bash中的文件描述符。

0代表stdin,1代表stdout,2代表stderror。3~9备用,用于其他临时用途。

任何文件描述符都可以使用操作符>或>>重定向到其他文件描述符或文件。

用途:>

请参考http://www.tldp.org/ldp/abs/html/io-redirection.html

您的示例将执行与OP要求不同的操作:它将把You_command的stderr重定向到stdout,将You_command的stdout重定向到output.log文件。此外,它不会附加到文件,但会覆盖该文件。

正确:对于所有其他文件,文件描述符可以是大于3的任何值。

您的答案显示了最常见的输出重定向错误:将stderr重定向到stdout当前指向的位置,并且仅在将stdout重定向到文件之后。这不会导致stderr重定向到同一文件。重定向的顺序很重要。

这是否意味着,我应该首先将stderror重定向到stdout,然后将stdout重定向到文件。1 > output.log 2>&1

@昆图斯。周,是的。您的版本将err重定向到out,同时将out重定向到file。

我很惊讶,近十年来,还没有人发布这种方法:

如果在没有&>>的情况下使用较旧版本的bash,您还可以执行以下操作:

(cmd 2>&1) >> file.txt

这产生了一个子外壳,因此它的效率比传统的cmd >> file.txt 2>&1方法低,但我觉得这种方法更自然,更容易理解:

将stderr重定向到stdout。

通过附加到文件来重定向新的stdout。

此外,圆括号还消除了顺序的任何模糊性,特别是如果您希望将stdout和stderr管道传输到另一个命令。

好啊。4年后你得到了认可。这就是艺术的本质,在得到认可之前,你有时间去死;o)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/566262.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++静态成员

在同类的多个对象之间实现数据共享,往往使用静态成员而不是全局变量。 C静态数据成员 1.1静态数据成员是一种特殊的数据成员。static int height;1.2静态数据成员可以通过类名来引用,也可以通过对象来引用。1.3静态数据成员不属于某一个对象,…

实践平台linux,关于构造Linux系统实践平台的设想

摘 要 当前虽然有很多高校将Linux课程作为本科学生的必修课,但是在高校中专业的Linux实验室却并未普及。在不增加机房管理员工作量以及学生可以充分体验Linux系统性能的前提下,本文提出了一种利用网络来实现Linux系统实践平台的构造方法,并且…

ndk linux 最新版本,NDK各版本下载

翻不了墙的话,可以用迅雷下载最新版本r20https://dl.google.com/android/repository/android-ndk-r20-windows-x86.ziphttps://dl.google.com/android/repository/android-ndk-r20-windows-x86_64.ziphttps://dl.google.com/android/repository/android-ndk-r20-dar…

c语言常用字符串处理函数6,【总结】C语言中常见的字符串处理函数

-------------------------------------------------------------------------------------------C语言中没有字符串类型,但是为了方便对字符串进行操作,提供了许多字符串处理函数。如:输入输出字符串,字符串的拷贝,连…

c语言 样例测试覆盖,白盒测试实例之十一——逻辑覆盖测试

逻辑覆盖测试是通过对程序逻辑结构的遍历实现程序的覆盖。从覆盖源代码的不同程度可以分为以下六个标准:语句覆盖、判定覆盖(又称为分支覆盖)、条件覆盖、判定-条件覆盖(又称为分支-条件覆盖)、条件组合覆盖和路径覆盖。先看一下具体例子的源代码(C语言)&#xff1a…

C++运算符重载函数作为类成员函数和友元函数

C运算符重载函数作为类成员函数 1.1成员函数的重载运算符左侧是一个类对象,而且与运算符函数类型相同。因为必须通过类的对象去调用该类的成员函数,而且只有运算符重载函数和返回值类型相同,运算结果才有意义。1.2将双目运算符重载为友元函数…

C语言辅导试题答案,C语言试题含答案).doc

一、单项选择题(在每小题的四个备选答案中,选出一个正确的答案,并将其代码填入题干后的括号内。每小题1分,共20分)1.程序中定义以下宏 #define S(a,b) a*b若定义 int area; 且令areaS(31,34),则变量area的值为( )A 10B 12C 21D 28…

C++重载流插入运算符与流提取运算符

C重载流插入运算符与流提取运算符 1.1 "<<" 流插入运算符&#xff0c;">>"流提取运算符。1.2对“<<”和“>>”重载的函数的形式如下&#xff1a;istream & operator >> (istream &,自定义的类&);ostream & …

c语言tcp push函数,如何在FreeBSD中使用TCP_NOPUSH调用sendfile之前添加头文件

我知道技术上FreeBSD中的TCP_NOPUSH和Linux中的TCP_CORK假设是类似的。如何在FreeBSD中使用TCP_NOPUSH调用sendfile之前添加头文件在Linux中&#xff0c;我可以设置TCP_CORK&#xff0c;发送头文件sendfile()&#xff0c;并且取消设置TCP_CORK以在文件前面插入头文件。在FreeBS…

C++不同数据类型的转换

C不同数据类型的转换 C标准类型数据的转换 1.1隐式类型转换&#xff0c;如&#xff1a; int i6; ii7.5; 1.2显式类型转换,如: 类型名(数据) 如int(89.5) 在C语言中 (int)89.5 建议用C的方式。 C用转换构造函数进行类型转换 1.1转换构造函数也是一种构造函数&#xff…

ev3的c语言编程软件,乐高EV3编程软件教育版下载

乐高EV3编程软件教育版官方版是一款用于机器人编程的应用工具&#xff0c;乐高EV3编程软件教育版最新版可以通过可视化图标形式编程&#xff0c;用以控制机器人的各种动作指令&#xff0c;乐高EV3编程软件教育版操作起来比较简单&#xff0c;发挥你的想象&#xff0c;创造无限的…

C++继承与派生

C继承与派生 1.1 C中可重用机制是通过继承这一个机制来实现的。1.2在C中所谓“继承”就是在一个已存在的类的基础上建立一个新的类&#xff0c;已存在的类(例如"马")称为“基类(base class)”或“父类(father class)”&#xff0c;新建立的类(例如“白马”)称为“派生…

Android代码删除通知,Android:从通知中删除通知b

Android&#xff1a;从通知中删除通知b我已经创建了一个应用程序&#xff0c;并且我设法在android通知栏中添加通知。 现在我需要示例如何从事件通知栏中删除该通知&#xff1f;11个解决方案197 votes你可以尝试这个快速代码public static void cancelNotification(Context ctx…

C++三大继承与多级派生

C公用继承 1.1在定义一个派生类时把派生方式指定为public的&#xff0c;称为公用继承&#xff0c;派生类称为公用派生类&#xff0c;基类称为公用派生类。1.2关于公用继承的一段代码:#include <iostream> using namespace std; class student { public: void display(); …

C++派生类的构造函数和析构函数

C派生类的构造函数和析构函数 派生类的构造函数和析构函数 #include <iostream> using namespace std; class student { public: student(int num,char* n):number(num),name(n){} ~student(){cout << "student deconstruted" << endl;} protecte…

android 4.0系统,全新Android 4.0系统_手机Android频道-中关村在线

与搭载Android 2.3系统的OPPO R807不同&#xff0c;OPPO R817搭载了Android 4.0系统。不过这款手机仍旧舍弃了Android系统的原生界面&#xff0c;因此两款手机在界面上的变化其实并不非常大。升级Android 4.0后界面变化不大内置多款主题与解锁样式可更改字体及SIM卡信息OPPO R8…

android sqlite 示例,android SQLite数据库使用示例

数据库的操作&#xff0c;需用到数据库类SQLiteDatabase&#xff0c;重写管理员类SQLiteOpenHelper&#xff0c;用Cursor查询数据一、操作数据库的辅助类&#xff0c;包含打开、关闭、增删改查方法//自定义的数据库的接口&#xff0c;其中包含SQLiteHelperpublic class NotesDb…

C++虚基类

C虚基类 1.1虚基类的作用&#xff1a;如果一个派生类有多个直接基类&#xff0c;而且这些直接基类又有一个共同的基类&#xff0c;则在最终的派生类中会保留该间接共同基类的多份同名成员。所以为了解决这个问题&#xff0c;C提供虚基类的方法&#xff0c;使得在继承间接共同基…

android清除图案锁 位置,安卓手机清除锁屏密码、锁屏图案的教程

来源&#xff1a;安卓网2014-01-21/12:15本文分享一个安卓手机清除锁屏密码以及锁屏图案的几种方法和详细教程。如果锁屏密码、或者图形锁屏密码忘记了怎么办&#xff0c;怎么清除呢?下面小编整理了3种安卓手机清除锁屏图案密码的方法。↓↓↓准备工作&#xff1a;1.确保已经安…

C++多态性

C多态 1.1多态性(polymorphism)是面向对象程序设计的一个重要特征。1.2从系统实现的角度看&#xff0c;多态性分两类&#xff1a;静态多态性与动态多态性。静态多态性是通过函数重载(运算符重载也是函数重载)来实现的。它又称为编译时多态。动态多样性是在程序运行过程中才动态…