1 和 2 在 Linux 中代表什么

在Linux零碎中0 1 2是一个文件描述符

从上表看的进去,咱们平时应用的

echo "hello" > t.log 

其实也能够写成

echo "hello" 1> t.log

对于2>&1的含意

对于输出/输入重定向本文就不细说了,不懂的能够参考这里:Shell:管道与重定向

  • 含意:将规范谬误输入重定向到规范输入
  • 符号>&是一个整体,不可离开,离开后就不是上述含意了。

    • 比方有些人可能会这么想:2是规范谬误输出,1是规范输入,>是重定向符号,那么"将规范谬误输入重定向到规范输入"是不是就应该写成"2>1"就行了?是这样吗?
    • 如果是尝试过,你就晓得2>1的写法其实是将规范谬误输入重定向到名为"1"的文件里去了
  • 写成2&>1也是不能够的

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

思考如下一条shell命令

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

(最初一个&示意把条命令放到后盾执行,不是本文重点,不懂的能够自行Google)

为什么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://blog.csdn.net/zhaomin...