linux中>&和&>区别

Linux 中常用的文件描述符

  • 0 文件描述符,表示标准输入。
  • 1 文件描述符,表示标准输出。
  • 2 文件描述符,表示标准错误。

标准情况下,这些文件描述符和以下设备关联:

  • 0 文件描述符关联键盘,并返回给前端。
  • 1 正确返回值,返回给前端。
  • 2 错误返回值,返回给前端。

> 符号

在 shell 中,我们经常使用 > 符号,把输出重定位到一个文件。例如:

1
cat /proc/xxx/maps > memory.txt

以上输出是把某个进程的内存布局重定向到一个文件。其中,> 是 1> 的简写,实际意思是把标准输出重定向到后面的文件。这样屏幕上就不会有打印了,打印会重定向到文件中。

>& 符号

本质上,>& 符号不是一个符号。我们经常见到 2>&1 符号,实际意义是,将标准错误重新定位到标准输出。那为什么要加个 & 呢?因为不加 & 的话操作系统不会认为你是想把标准错误重定位给标准输出,而是想重定向到一个叫 “1” 的文件。所以 &1 表示 1 输出通道。举例,strace 命令可以查看系统调用,这个结果是输出到标准错误的。

1
strace ls > log 2>&1

将标准输出重定向到 log 文件,并将标准错误重定向到标准输出。这样标准错误也会被重定向到 log 文件。

&> 符号

&> 意思是把标准错误和标准输出都重定向到某个文件。

1
strace ls &> log

写起来比较简单,且省力。