在Unix shell中,如果要将stderr和stdout组合到stdout流中以进行进一步的操作,则可以在命令末尾附加以下内容:

2>&1

因此,如果我想在g++的输出中使用head ,则可以执行以下操作:

g++ lots_of_errors 2>&1 | head

因此我只能看到前几个错误。

我总是很难记住这一点,而且我经常不得不去查找它,这主要是因为我不完全理解这个特殊技巧的语法。

有人可以分手并逐个字符地解释2>&1含义吗?

#1楼

人们,永远记住paxdiablo关于重定向目标当前位置的提示……这很重要。

我对2>&1运算符的个人记忆是:

想想&作为意义'and'或'add' (字符是一个ampers - 而且 ,不是吗?)

因此它变成: '将2 (stderr)重定向到已经(当前) 1 (stdout)所在的位置并添加两个流“ 。

同样的助记符也可以用于其他经常使用的重定向, 1>&2 :

考虑&含义, and add ...(您对&符有想法,对吗?)

因此它变成: '将1 (stdout)重定向到2 (stderr)已经/当前所在的位置并添加两个流' 。

并始终记住:您必须从右到左( 而不是从左到右)“从头到尾”读取重定向链。

#2楼

有关重定向的一些技巧

关于此的某些语法特殊性可能具有重要的行为。 关于重定向, STDERR , STDOUT和参数排序有一些小示例。

1-覆盖还是附加?

符号>均值重定向 。

>表示发送到一个完整的完整文件 ,如果存在noclobber覆盖目标(请参阅稍后的#3 noclobber bash功能)。

>>表示除发送外还将附加到目标(如果存在)。

无论如何,如果文件不存在,则会创建该文件。

2- Shell命令行取决于顺序!!

为了测试这一点,我们需要一个简单的命令,该命令将在两个输出上发送一些信息 :

$ ls -ld /tmp /tnt

ls: cannot access /tnt: No such file or directory

drwxrwxrwt 118 root root 196608 Jan 7 11:49 /tmp

$ ls -ld /tmp /tnt >/dev/null

ls: cannot access /tnt: No such file or directory

$ ls -ld /tmp /tnt 2>/dev/null

drwxrwxrwt 118 root root 196608 Jan 7 11:49 /tmp

(当然,希望您没有一个名为/tnt的目录)。 好吧,我们有!!

因此,让我们看看:

$ ls -ld /tmp /tnt >/dev/null

ls: cannot access /tnt: No such file or directory

$ ls -ld /tmp /tnt >/dev/null 2>&1

$ ls -ld /tmp /tnt 2>&1 >/dev/null

ls: cannot access /tnt: No such file or directory

最后一个命令行将STDERR转储到控制台,这似乎不是预期的行为...但是...

如果要对一个输出,另一个输出或两个输出进行后期过滤 :

$ ls -ld /tmp /tnt | sed 's/^.*$//'

ls: cannot access /tnt: No such file or directory

$ ls -ld /tmp /tnt 2>&1 | sed 's/^.*$//'

$ ls -ld /tmp /tnt >/dev/null | sed 's/^.*$//'

ls: cannot access /tnt: No such file or directory

$ ls -ld /tmp /tnt >/dev/null 2>&1 | sed 's/^.*$//'

$ ls -ld /tmp /tnt 2>&1 >/dev/null | sed 's/^.*$//'

请注意,本段的最后一个命令行与上一段完全相同,在那段我写的似乎不是预期的行为 (因此,这甚至可能是预期的行为)。

嗯,关于重定向, 在两个输出上执行不同的操作有一些技巧:

$ ( ls -ld /tmp /tnt | sed 's/^/O: /' >&9 ) 9>&2 2>&1 | sed 's/^/E: /'

O: drwxrwxrwt 118 root root 196608 Jan 7 12:13 /tmp

E: ls: cannot access /tnt: No such file or directory

注意: &9描述符会由于( ) 9>&2自发出现。

附录:nota! 在新版本的bash ( >4.0 )中,有一种新功能和更性感的语法可以执行以下操作:

$ ls -ld /tmp /tnt 2> >(sed 's/^/E: /') > >(sed 's/^/O: /')

O: drwxrwxrwt 17 root root 28672 Nov 5 23:00 /tmp

E: ls: cannot access /tnt: No such file or directory

最后是这样的级联输出格式:

$ ((ls -ld /tmp /tnt |sed 's/^/O: /' >&9 ) 2>&1 |sed 's/^/E: /') 9>&1| cat -n

1 O: drwxrwxrwt 118 root root 196608 Jan 7 12:29 /tmp

2 E: ls: cannot access /tnt: No such file or directory

附录:nota! 两种方式都具有相同的新语法:

$ cat -n >(sed 's/^/E: /') > >(sed 's/^/O: /'))

1 O: drwxrwxrwt 17 root root 28672 Nov 5 23:00 /tmp

2 E: ls: cannot access /tnt: No such file or directory

当STDOUT经过一个特定的过滤器时, STDERR到达另一个过滤器,最后合并的两个输出都经过第三个命令过滤器。

3-关于noclobber选项和>|词汇 句法

那是关于覆盖 :

当set -o noclobber指示bash 不覆盖任何现有文件时, >| 语法使您可以克服此限制:

$ testfile=$(mktemp /tmp/testNoClobberDate-XXXXXX)

$ date > $testfile ; cat $testfile

Mon Jan 7 13:18:15 CET 2013

$ date > $testfile ; cat $testfile

Mon Jan 7 13:18:19 CET 2013

$ date > $testfile ; cat $testfile

Mon Jan 7 13:18:21 CET 2013

现在,文件每次都会被覆盖:

$ set -o noclobber

$ date > $testfile ; cat $testfile

bash: /tmp/testNoClobberDate-WW1xi9: cannot overwrite existing file

Mon Jan 7 13:18:21 CET 2013

$ date > $testfile ; cat $testfile

bash: /tmp/testNoClobberDate-WW1xi9: cannot overwrite existing file

Mon Jan 7 13:18:21 CET 2013

通过>| :

$ date >| $testfile ; cat $testfile

Mon Jan 7 13:18:58 CET 2013

$ date >| $testfile ; cat $testfile

Mon Jan 7 13:19:01 CET 2013

取消设置此选项和/或查询是否已设置。

$ set -o | grep noclobber

noclobber on

$ set +o noclobber

$ set -o | grep noclobber

noclobber off

$ date > $testfile ; cat $testfile

Mon Jan 7 13:24:27 CET 2013

$ rm $testfile

4-最后一招等等

为了重定向给定命令的两个输出,我们看到正确的语法可能是:

$ ls -ld /tmp /tnt >/dev/null 2>&1

对于这种特殊情况,有一个快捷语法: &> ...或>&

$ ls -ld /tmp /tnt &>/dev/null

$ ls -ld /tmp /tnt >&/dev/null

注意:如果2>&1存在,则1>&2也是正确的语法:

$ ls -ld /tmp /tnt 2>/dev/null 1>&2

4b-现在,我将让您考虑:

$ ls -ld /tmp /tnt 2>&1 1>&2 | sed -e s/^/++/

++/bin/ls: cannot access /tnt: No such file or directory

++drwxrwxrwt 193 root root 196608 Feb 9 11:08 /tmp/

$ ls -ld /tmp /tnt 1>&2 2>&1 | sed -e s/^/++/

/bin/ls: cannot access /tnt: No such file or directory

drwxrwxrwt 193 root root 196608 Feb 9 11:08 /tmp/

4c-如果您对更多信息感兴趣

您可以点击以下内容阅读精美的手册:

man -Len -Pless\ +/^REDIRECTION bash

在bash控制台中;-)

#3楼

2是控制台标准错误。

1是控制台标准输出。

这是标准的Unix,Windows也遵循POSIX。

例如,当您跑步时

perl test.pl 2>&1

标准错误将重定向到标准输出,因此您可以同时看到两个输出:

perl test.pl > debug.log 2>&1

执行后,您可以在debug.log中看到所有输出,包括错误。

perl test.pl 1>out.log 2>err.log

然后,标准输出转到out.log,标准错误转到err.log。

我建议您尝试了解这些。

#4楼

这就像将错误传递到标准输出或终端一样。

也就是说, cmd不是命令:

$cmd 2>filename

cat filename

command not found

错误将发送到文件,如下所示:

2>&1

标准错误发送到终端。

#5楼

重定向输入

输入的重定向导致打开其名称由单词扩展产生的文件,以供在文件描述符n上读取;如果未指定n,则打开标准输入(文件描述符0)。

重定向输入的一般格式为:

[n]

重定向输出

输出重定向导致打开其名称由单词扩展产生的文件,以便在文件描述符n上进行写操作;如果未指定n,则打开标准输出(文件描述符1)。 如果文件不存在,则创建该文件; 如果确实存在,则将其截断为零大小。

重定向输出的一般格式为:

[n]>word

移动文件描述符

重定向运算符,

[n]

将文件描述符数字移动到文件描述符n,或者如果未指定n,则将标准输入(文件描述符0)移动到文件描述符n。 数字复制到n后关闭。

同样,重定向运算符

[n]>&digit-

将文件描述符数字移动到文件描述符n,或者如果未指定n,则将标准输出(文件描述符1)移动到文件描述符n。

参考:

man bash

键入/^REDIRECT定位到redirection部分,并了解更多信息...

在线版本在这里:

PS:

很多时候, man是学习Linux的强大工具。

java中的12的意思_在外壳中,“ 2&1”是什么意思?相关推荐

  1. java根据散点图模拟出直线_借助Excel中XY散点图来模拟实现纵向折线图的方法

    Excel中的折线图通常是在水平方向上展示数据图线,如果希望在纵向上也能展现折线图,可以借助XY散点图来模拟实现.本文就图文介绍了借助Excel中XY散点图来模拟实现纵向折线图的方法. 具体方法可参考 ...

  2. python中numpy数组的合并_基于Python中numpy数组的合并实例讲解

    基于Python中numpy数组的合并实例讲解 Python中numpy数组的合并有很多方法,如 - np.append() - np.concatenate() - np.stack() - np. ...

  3. python中的静态方法如何调用_关于Python中如何使用静态、类、抽象方法的权威指南(译)...

    对于Python中静态.类.抽象方法的使用,我是一直很迷糊的.最近看到一篇技术文章对这方面解释的很好,在此翻译一下,加深印象,也为有需要的同学提供一个方便. Python中方法是如何工作的: 方法即函 ...

  4. python中gmtime的hour错误_python中gmtime的hour错误_在Python中操作日期和时间之gmtime()方法的使用...

    python中datetime怎么用广告总是在最精彩的时候出现,你总是在小编爱的最深的时候离开. ''''' 日期相关的操作 ''' from datetime import datetime fro ...

  5. python中for语句的使用_对Python中for复合语句的使用示例讲解

    当Python中用到双重for循环设计的时候我一般会使用循环的嵌套,但是在Python中其实还存在另一种技巧--for复合语句. 简单写一个小程序,用于延时循环嵌套功能如下: #!/usr/bin/p ...

  6. excel中显示隐藏的行_在Excel中显示或隐藏用户提示

    excel中显示隐藏的行 When you set up a worksheet for other people to use, data validation messages can help ...

  7. python中正确的赋值语句为_在Python中,正确的赋值语句为(    )

    [填空题]在 32 位的编译系统中(比如 VC ), char 占 _____ 个字节 ? (5.0分) [单选题]鱼眼镜头的焦距很短,特点是? [多选题]我国建设部明确指出建筑业全面贯彻什么的方针 ...

  8. 将指定的计数添加到信号量中会导致其超过_从烷烃中分离烯烃、从原油中分离碳氢化合物…这七大化学分离过程将影响世界...

    <自然>(Nature)2016年刊登过一篇评论,来自佐治亚理工学院(Georgia Instituteof Technology)的两名学者归纳出了七大能源密集型分离过程,指出这些分离过 ...

  9. 电路中滤波电容和退耦电容_电子电路中电容的作用,滤波消抖,充放电,耦合,退耦...

    电容器(capacitor),是一种容纳电荷的器件,是电子设备中大量使用的电子元件之一,任何两个彼此绝缘且相隔很近的导体(包括导线)间都构成一个电容器.广泛应用于电路中的隔直通交,耦合,旁路,滤波,调 ...

最新文章

  1. ef sqlserver切换到mysql_可以为MySql和SqlServer使用EF上下文吗?
  2. idea 分支管理插件_Git的分支管理常用命令
  3. 电大计算机理工英语19年秋季,国开电大理工英语1单元自测5形考任务答案
  4. Android App性能优化十技巧
  5. Oracle Database 11g 下载
  6. 商业价值:中国互联网的产品经理时代
  7. win11在计算机管理中添加用户发现没有本地用户和组,命令方式添加用户以及查看用户
  8. 电信天翼网关连接多个路由器
  9. 【数位DP】Windy数
  10. Highcharts 写 venn图 (韦恩图),以及解决项目中venn的报错
  11. Excel集成股票分析工具案例
  12. 未明学院数据分析报告:金融专业如何找实习?数据分析告诉你整个金融实习市场全貌!
  13. 基于Web的电子商务解决方案(1)(转)
  14. win10有信号没有网络连接到服务器,win10系统显示网络连接正常但没有网络,无法上网的办法介绍...
  15. 前端Photoshop切图快速入门
  16. element-ui el-dialog侧边弹窗可横向拖拽改变宽度
  17. Vue form表单input框 手动赋值 提交时 表单input值没有生效 验证仍然是空
  18. 大学英语计算机不过只能拿结业证吗,在大学期间建议去考的证书
  19. 用java定义中国象棋的棋子_java大神 求帮忙 我坐的中国象棋怎样移动棋子
  20. 基金委发布项目申报指南

热门文章

  1. 小C实例也有大梦想——自定义strlen函数
  2. 榕树贷款 探索人工智能技术 打造金融机构转型新引擎
  3. SVM 美国威斯康星州乳腺癌检测
  4. 华为机试:火星符号运算
  5. 是面试官放水,还是实在公司太缺人?这都没挂,阿里巴巴原来这么容易进...
  6. 解密刷子是如何进行APP刷量的?
  7. python利用jieba实现中文分词
  8. Android 音视频开发相关知识
  9. 强化学习(RL)中的Q-learning在拿奖杯游戏的表现
  10. 2022年ABC123公众号年刊下载(PDF电子书)