深入理解 Linux shell 中 2>&1 的含义

杰哥的IT之旅

共 2522字,需浏览 6分钟

 ·

2021-06-23 19:06

公众号关注杰哥的IT之旅”,

选择“星标”,重磅干货,第一时间送达!

首先了解下1和2在Linux中代表什么

在Linux系统中0 1 2是一个文件描述符

名称代码操作符Java中表示Linux 下文件描述符(Debian 为例)
标准输入(stdin)0< 或 <<System.in/dev/stdin -> /proc/self/fd/0 -> /dev/pts/0
标准输出(stdout)1>, >>, 1> 或 1>>System.out/dev/stdout -> /proc/self/fd/1 -> /dev/pts/0
标准错误输出(stderr)22> 或 2>>System.err/dev/stderr -> /proc/self/fd/2 -> /dev/pts/0

从上表看的出来,我们平时使用的

echo "hello" > t.log 

其实也可以写成

echo "hello" 1> t.log

关于2>&1的含义

  • 含义:将标准错误输出重定向到标准输出

  • 符号>&是一个整体,不可分开,分开后就不是上述含义了。

比如有些人可能会这么想:2是标准错误输入,1是标准输出,>是重定向符号,那么"将标准错误输出重定向到标准输出"是不是就应该写成"2>1"就行了?是这样吗?

如果是尝试过,你就知道2>1的写法其实是将标准错误输出重定向到名为"1"的文件里去了

  • 写成2&>1也是不可以的

为什么2>&1要放在后面

考虑如下一条shell命令

nohup java -jar app.jar >log 2>&1 &

为什么2>&1一定要写到>log后面,才表示标准错误输出和标准输出都定向到log中?

我们不妨把1和2都理解是一个指针,然后来看上面的语句就是这样的:

  • 本来1----->屏幕 (1指向屏幕)

  • 执行>log后, 1----->log (1指向log)

  • 执行2>&1后, 2----->1 (2指向1,而1指向log,因此2也指向了log)

再来分析下

nohup java -jar app.jar 2>&1 >log &


  • 本来1----->屏幕 (1指向屏幕)

  • 执行2>&1后, 2----->1 (2指向1,而1指向屏幕,因此2也指向了屏幕)

  • 执行>log后, 1----->log (1指向log,2还是指向屏幕)

所以这就不是我们想要的结果。

简单做个试验测试下上面的想法:

java代码如下:

public class Htest {
    public static void main(String[] args{
        System.out.println("out1");
        System.err.println("error1");
    }
}

javac编译后运行下面指令:

java Htest 2>&1 > log

你会在终端上看到只输出了"error1",log文件中则只有"out1"

每次都写">log 2>&1"太麻烦,能简写吗?

有以下两种简写方式

&>log
>&log

比如上面小节中的写法就可以简写为:

nohup java -jar app.jar &>log &

上面两种方式都和">log 2>&1"一个语义。

那么 上面两种方式中&>和>&有区别吗?

语义上是没有任何区别的,但是第一中方式是最佳选择,一般使用第一种

参考:

https://unix.stackexchange.com/questions/89386/what-is-symbol-and-in-unix-linux
https://superuser.com/questions/335396/what-is-the-difference-between-and-in-bash

作者:一个行走的民  

https://blog.csdn.net/zhaominpro/article/details/82630528

公众号「杰哥的IT之旅」后台回复「搜索」即可搜索你所需要的文章;
公众号「杰哥的IT之旅」后台回复「wx」添加杰哥微信即可加入读者交流群;

推荐阅读

Kubernetes 日志收集的原理,看这一篇就够了

手把手教你在 Linux 7 环境下部署 Oracle RAC!

Linux 下如何实现 MySQL 数据库每天自动备份定时备份

有了这 27 个Linux 技巧,让你工作效率翻倍!

如何在 Linux 下优雅的进行大文件切割与合并?

杰哥的另一个公众号,主要分享关于个人成长经历的那点事,欢迎您的关注。

浏览 15
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报