2 > &1 到底是什么意

标准输入/标准输出/标准错误

进程的文件描述符的前 3 项已经被默认使用了。

  • 0:标准输入(stdin)
  • 1:标准输出(stdout)
  • 2:标准错误(stderr)

这些名词怎么理解?

我们在 Java 中使用 new Scanner(System.in) 接收从键盘的输入,使用 System.out.println() 向显示器写数据,对应 C 语言分别是 scanf()printf()

需要明确的是, 函数并非直接使用键盘和显示器,而是使用了标准输入和标准输出

说得再通俗一点就是,进程生来就有一个耳朵和两张嘴,耳朵用来接受 标准输入 里的数据,一个嘴往 标准输出 里边“说话”,另一张嘴往 标准错误 里边“吐槽”。

500

函数并不知道数据从哪里来,也不关心数据要到哪里去,它们只需要从 标准输入 读数据,向 标准输出标准错误 中写数据就行了。

这就是抽象啊,朋友们!

默认情况下,操作系统会把所有键盘输入都发送到 标准输入,会把从 标准输出标准错误 中读到数据发送到显示器。

500

为了方便表示,下文不再将全局文件表画出,而是用一张表来简化表示文件描述符和数据流之间的对应关系。

500

接下来我们就可以解释文章开头提的问题了。

输入输出重定向

标准输入/输出/错误 在描述表的位置虽然是固定的,但他们指向的数据流是可以改变的。

500

java -jar snapshot.jar > snapshot.log 2>&1 &

这条指令的意思就是将 snapshot.jar 程序用 > 运算符重定向标准输出,由原本的指向显示器改为 snapshot.log 文件。

2> 是用来重定向标准错误,因为 标准错误 在描述符表中的 fd 就是 2,同样,其实重定向标准输出也可以表示为 1>,不过一般简写为 >

标准错误标准输出 可以重定向到同一个地方,比如指令中的 &1 表示的就是 标准输出2>&1 的含义就是重定向标准错误到 标准输出 表示的数据流中。

>& 表示重定向逻辑。