在shell中,"2>&1"是什么意思?

Tri*_*ick 2121 unix bash shell redirect

在Unix shell中,如果我想要组合stderrstdout进入stdout流进行进一步操作,我可以在命令的末尾添加以下内容:

2>&1
Run Code Online (Sandbox Code Playgroud)

所以,如果我想head在输出上使用g++,我可以这样做:

g++ lots_of_errors 2>&1 | head
Run Code Online (Sandbox Code Playgroud)

所以我只能看到前几个错误.

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

有人可以打破这个并按字符解释具体2>&1 意义吗?

Aym*_*ieh 2374

文件描述符1是标准输出(stdout).
文件描述符2是标准错误(stderr).

这里是要记住这个结构(尽管它并不完全准确)的一种方法:首先,2>1可能看起来像重定向的好办法stderrstdout.但是,它实际上将被解释为"重定向stderr到名为1" 的文件.&表示后面是文件描述符而不是文件名.所以构造变成:2>&1.

  • @Dominik:不,"&"在重定向的上下文中只被解释为"文件描述符".编写`command&2>&`被解析为`command&`和`2>&1`,即在后台运行`run`命令`,然后运行命令`2`并将其stdout重定向到它的stdout". (284认同)
  • 但那不应该是'&2>&1`吗? (251认同)
  • @Martin:'2>'和1' (102认同)
  • 但是如何将stderr重定向到名为'&1'的文件? (72认同)
  • 他们为什么选择这样神秘的东西呢?只是好奇. (5认同)
  • @ThangPham表示STDOUT附加到data.log**和**STDERR转储到STDOUT(控制台或下一个命令)看到我的答案 (3认同)
  • 你为什么说它不完全准确?你跳过了哪些细节? (3认同)
  • @CommaToast 完全正确。每个人都告诉我“魔法常量在编程中很糟糕,避免使用它们,而是使用名称”。我们在操作系统的核心中有硬编码的文件描述符整数。废话。为什么他们不能只使用像“stderr > stdout”这样的关键字?另一个不一致之处 - `>` 通常表示“替换”。因此,“2>&1”可能会与用错误输出替换所有输出相混淆。为什么不像我们对文件那样使用“>>”进行追加呢?所以,我投票支持“stderr >> stdout”。 (3认同)
  • @JustAMartin,您可以使用 `2>> /dev/stdout` 而不是 `2>&1`。我认为没有办法用关键字替换“2>>”,因为它与命令的参数无法区分。您现在应该使用“>>”,因为在这种情况下,输出文件将再次打开,而不仅仅是复制文件描述符,并且“>”在打开后截断文件(如果 stdout 重定向到日志,则您不希望这样做)文件)。 (3认同)
  • >>表示将输出附加到data.log文件. (2认同)
  • 所以&含义文件描述符,也去了后台?Linux需要停止使用相同的符号,这太令人困惑了!! (2认同)
  • 如果这有助于某人的助记符,我认为这种方式与C语言`&`运算符相关联,"地址" - 所以,`2>&1`作为一个整体我在脑海中读到类似的东西"(文件描述符)2重定向到(文件描述符)1"的地址.即,*fd1当前正在进行*,截至shell读取该4字符序列的时间.(因为它可以改变.为了好玩,试试:`((echo 1/stdout; echo 2/stderr>&2)2>&1>/dev/tty)| grep --color .` - 它会着色什么开始作为标准错误("2/stderr").) (2认同)
  • 作为助记符,如果您了解 C,遵循指针算术,您可以将其视为“2 (`2`) 的内容转到 (`>`) 到 1 所在的位置,即到 1 的_内存地址_ (`&1` )”。 (2认同)

dbr*_*dbr 588

echo test > afile.txt
Run Code Online (Sandbox Code Playgroud)

将stdout重定向到afile.txt.这和做的一样

echo test 1> afile.txt
Run Code Online (Sandbox Code Playgroud)

要重定向stderr,您可以:

echo test 2> afile.txt
Run Code Online (Sandbox Code Playgroud)

>& 是将流重定向到另一个文件描述符的语法 - 0是stdin,1是stdout,2是stderr.

您可以通过执行以下操作将stdout重定向到stderr:

echo test 1>&2 # or echo test >&2
Run Code Online (Sandbox Code Playgroud)

或相反亦然:

echo test 2>&1
Run Code Online (Sandbox Code Playgroud)

因此,简而言之...... 2>将stderr重定向到(未指定的)文件,将&1stderr重定向到stdout.

  • @dbr`cmd 2>&1 >> file`不会将stderr重定向到文件,但`cmd >>文件2>&1`会重定向.订单很重要.在第一种情况下,stderr被重定向到shell的stdout(如果以交互方式输入命令,则可能是tty),然后将stdout定向到该文件.在第二种情况下,stdout被定向到文件,然后stderr被定向到同一个地方. (72认同)
  • 这对你有意义吗,`java ... 2&1 >> data.log`,我看到我的一位同事这样做了吗? (5认同)
  • @Harry看起来像是一个不是bash的shell,或者是一个错字.`cmd 2>&1 >> somefile.log`会将stdout/stderr附加到一个文件 - 它与上面的基本相同,带有`>>要附加的文件` (5认同)
  • 我喜欢上面的答案,但它可能更清晰."2>&1"将stderr重定向到stdout的目标.所以如果你有类似"ls -l >> directoryContents 2>&1"的结果,结果将是一个名为directoryContents的文件,它将附加工作目录的内容.如果执行中有任何错误:错误消息也会在发生时附加到directoryContents文件中. (2认同)

F. *_*uri 308

关于重定向的一些技巧

关于此的一些语法特殊性可能具有重要的行为.有一个关于重定向,一些小的样本STDERR,STDOUT和参数排序.

1 - 覆盖或追加?

符号>意味着重定向.

  • >意味着发送到整个已完成的文件,如果存在则覆盖目标(稍后参见#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
Run Code Online (Sandbox Code Playgroud)

(当然,期待你没有一个名为的目录/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
Run Code Online (Sandbox Code Playgroud)

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

如果你想对一个输出进行一些后置过滤,另一个或两者都是:

$ ls -ld /tmp /tnt | sed 's/^.*$/<-- & --->/'
ls: cannot access /tnt: No such file or directory
<-- drwxrwxrwt 118 root root 196608 Jan  7 12:02 /tmp --->

$ ls -ld /tmp /tnt 2>&1 | sed 's/^.*$/<-- & --->/'
<-- ls: cannot access /tnt: No such file or directory --->
<-- drwxrwxrwt 118 root root 196608 Jan  7 12:02 /tmp --->

$ 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: cannot access /tnt: No such file or directory --->
Run Code Online (Sandbox Code Playgroud)

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

好吧,有一些关于重定向的技巧, 在两个输出上做不同的操作:

$ ( 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
Run Code Online (Sandbox Code Playgroud)

Nota:&9描述符会因为而自发发生) 9>&2.

附录:nota!使用新版本的(>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
Run Code Online (Sandbox Code Playgroud)

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

$ ((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
Run Code Online (Sandbox Code Playgroud)

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

$ cat -n <(ls -ld /tmp /tnt 2> >(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
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

每次都会覆盖该文件,现在好了:

$ 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
Run Code Online (Sandbox Code Playgroud)

通过>|:

$ date >| $testfile ; cat $testfile
Mon Jan  7 13:18:58 CET 2013

$ date >| $testfile ; cat $testfile
Mon Jan  7 13:19:01 CET 2013
Run Code Online (Sandbox Code Playgroud)

取消设置此选项和/或询问是否已设置.

$ 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
Run Code Online (Sandbox Code Playgroud)

4 - 最后一招和更多......

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

$ ls -ld /tmp /tnt >/dev/null 2>&1
Run Code Online (Sandbox Code Playgroud)

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

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

$ ls -ld /tmp /tnt >&/dev/null
Run Code Online (Sandbox Code Playgroud)

Nota:如果2>&1存在,1>&2也是一个正确的语法:

$ ls -ld /tmp /tnt 2>/dev/null 1>&2
Run Code Online (Sandbox Code Playgroud)

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/
Run Code Online (Sandbox Code Playgroud)

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

您可以通过点击阅读精细手册:

man -Len -Pless\ +/^REDIRECTION bash
Run Code Online (Sandbox Code Playgroud)

控制台;-)

  • *进一步阅读:*如果你喜欢这个,你可能会赞同:[重定向滥用如何导致奇怪的行为](http://stackoverflow.com/q/14423442/1765658) (5认同)

Dee*_*ohn 104

我在重定向上找到了这篇精彩的帖子:所有关于重定向的内容

将标准输出和标准错误重定向到文件

$ command&> file

这个单行使用&>运算符将两个输出流(stdout和stderr)从命令重定向到文件.这是Bash快速将两个流重定向到同一目的地的快捷方式.

以下是Bash重定向两个流后文件描述符表的样子:

在此输入图像描述

正如你所看到的,stdout和stderr现在都指向了file.因此写入stdout和stderr的任何内容都会被写入file.

有两种方法可以将两个流重定向到同一目标.您可以一个接一个地重定向每个流:

$ command> file 2>&1

这是将两个流重定向到文件的更常见方法.第一个stdout被重定向到文件,然后stderr被复制到与stdout相同.所以这两个流最终都指向了file.

当Bash看到几个重定向时,它会从左到右处理它们.让我们完成这些步骤,看看会发生什么.在运行任何命令之前,Bash的文件描述符表如下所示:

在此输入图像描述

现在Bash处理第一个重定向>文件.我们之前看过这个,它使stdout指向文件:

在此输入图像描述

下一个Bash看到第二个重定向2>&1.我们之前没有见过这种重定向.这个复制文件描述符2是文件描述符1的副本,我们得到:

在此输入图像描述

两个流都已重定向到文件.

不过要小心!写作

命令>文件2>&1

与写作不同:

$ command 2>&1>文件

重定向的顺序在Bash中很重要!此命令仅将标准输出重定向到文件.stderr仍会打印到终端.要理解为什么会发生这种情况,让我们再次讨论这些步骤.所以在运行命令之前,文件描述符表如下所示:

在此输入图像描述

现在Bash处理从左到右的重定向.它首先看到2>&1所以它将stderr复制到stdout.文件描述符表变为:

在此输入图像描述

现在Bash看到第二个重定向,>file并将stdout重定向到file:

在此输入图像描述

你看到这里发生了什么?Stdout现在指向文件,但是stderr仍然指向终端!写入stderr的所有内容仍会打印到屏幕上!所以要非常非常小心重定向的顺序!

还要注意在Bash中写作

$ command&> file

与以下内容完全相同:

$ command>&file

  • 如果"command"以数字结尾,则后两个是不同的,因为它被视为`>&`的可选文件描述符 (3认同)
  • 这是一个非常好的视觉解释。如果我成为提出这个问题的人,我会将其标记为已接受的答案。 (2认同)

Col*_*ett 80

数字指的是文件描述符(fd).

  • 零是 stdin
  • 一个是 stdout
  • 二是 stderr

2>&1 将fd 2重定向到1.

如果程序使用它们,这适用于任意数量的文件描述符.

你可以看看/usr/include/unistd.h你是否忘了它们:

/* Standard file descriptors.  */
#define STDIN_FILENO    0   /* Standard input.  */
#define STDOUT_FILENO   1   /* Standard output.  */
#define STDERR_FILENO   2   /* Standard error output.  */
Run Code Online (Sandbox Code Playgroud)

这就是说我编写了使用非标准文件描述符进行自定义日志记录的C工具,因此除非将其重定向到文件或其他内容,否则不会看到它.


pax*_*blo 56

该构造将标准错误stream(stderr)发送到标准输出()的当前位置stdout- 这个货币问题似乎被其他答案忽略了.

您可以使用此方法将任何输出句柄重定向到另一个输出句柄,但它最常用于通道stdoutstderr流式传输到单个流中进行处理.

一些例子是:

# Look for ERROR string in both stdout and stderr.
foo 2>&1 | grep ERROR

# Run the less pager without stderr screwing up the output.
foo 2>&1 | less

# Send stdout/err to file (with append) and terminal.
foo 2>&1 |tee /dev/tty >>outfile

# Send stderr to normal location and stdout to file.
foo >outfile1 2>&1 >outfile2
Run Code Online (Sandbox Code Playgroud)

请注意,最后一个将不会直接stderroutfile2-它重定向到什么stdout时遇到的参数(是outfile1),并随后重定向stdoutoutfile2.

这允许一些非常复杂的技巧.

  • 虽然最后一个例子会更加清晰:foo> outfile2 2> outfile1 (5认同)
  • 我刚刚意识到最后一个例子也解决了我为什么这样做的长期困惑:`some_program 2>&1>/dev/null`不能像这样工作:`some_program>/dev/null 2>&1`. (5认同)
  • 更清楚,是的,但这不会显示重定向的"位置"性质.这个例子是设计的,因为在一行中执行此操作通常不常用 - 当不同的各方负责重定向的不同部分时,该方法变得非常有用.例如,当脚本执行一点重定向并且您使用另一位运行它时. (3认同)

Küñ*_*örà 31

如果您是初学者,我发现这非常有帮助,请阅读此内容

更新:
在 Linux 或 Unix 系统中,程序将输出发送到两个地方:标准输出 (stdout) 和标准错误 (stderr)。您可以将这些输出重定向到任何文件。

就像你这样做一样

ls -a > output.txt

,控制台中不会打印任何内容,所有输出(stdout)都被重定向到输出文件。

如果你尝试打印任何不存在的文件的内容意味着输出将是一个错误,就像你打印当前目录中不存在的 test.txt

cat test.txt > error.txt

输出将是

cat: test.txt :No such file or directory
Run Code Online (Sandbox Code Playgroud)

但是 error.txt 文件将是空的,因为我们将 stdout 重定向到一个不是 stderr 的文件。

所以我们需要文件描述符(文件描述符只不过是一个代表打开文件的正整数。你可以说描述符是文件的唯一ID)来告诉shell我们发送给文件的输出类型。在Unix / Linux系统中1 用于 stdout , 2 用于 stderr

所以现在如果你这样做

ls -a 1> output.txt意味着你将标准输出 (stdout) 发送到 output.txt。

如果您这样做,则

cat test.txt 2> error.txt意味着您将标准错误 (stderr) 发送到 error.txt 。

&1用于引用文件描述符 1 (stdout) 的值。

现在重点2>&1是“将标准错误重定向到我们重定向标准输出的同一个地方”

现在你可以这样做
<br

cat maybefile.txt > output.txt 2>&1

标准输出 (stdout) 和标准错误 (stderr) 都将重定向到 output.txt。

感谢Ondrej K.指出


wjo*_*dan 19

2>&1是一个POSIX shell构造.这是按令牌分类的令牌:


2:" 标准错误 "输出文件描述符.

>&:复制输出文件描述符运算符(输出重定向运算符的变体>).给定[x]>&[y],表示的文件描述符x是输出文件描述符的副本y.

1" 标准输出 "输出文件描述符.

表达式将2>&1文件描述符复制1到位置2,因此2在执行环境中写入("标准错误")的任何输出都转到最初由1("标准输出")描述的同一文件.


进一步说明:

文件描述符:"每个进程唯一的非负整数,用于标识用于文件访问的打开文件."

标准输出/错误:请参阅shell文档的Redirection部分中的以下注释:

打开的文件由以零开头的十进制数表示.最大可能的值是实现定义的; 但是,所有实现都应支持至少0到9(包括0和9),以供应用程序使用.这些数字称为"文件描述符".值0,1和2具有特殊含义和常规用途,并且由某些重定向操作暗示; 它们分别称为标准输入,标准输出和标准误差.程序通常从标准输入中获取输入,并在标准输出上写入输出.错误消息通常写在标准错误上.重定向运算符可以在一个或多个数字前面(不允许插入字符)来指定文件描述符号.


Mar*_*ton 18

2是控制台标准错误.

1是控制台标准输出.

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

比如你跑步的时候

perl test.pl 2>&1
Run Code Online (Sandbox Code Playgroud)

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

perl test.pl > debug.log 2>&1
Run Code Online (Sandbox Code Playgroud)

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

perl test.pl 1>out.log 2>err.log
Run Code Online (Sandbox Code Playgroud)

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

我建议你试着去理解这些.


And*_*oid 16

回答你的问题:它需要任何错误输出(通常发送到stderr)并将其写入标准输出(stdout).

当您需要对所有输出进行分页时,这有助于例如"更多".有些程序喜欢将使用信息打印到stderr中.

为了帮助你记住

  • 1 =标准输出(程序打印正常输出)
  • 2 =标准错误(程序打印错误)

"2>&1"只是将发送到stderr的所有内容指向stdout.

我还建议阅读这篇关于错误重定向的帖子,其中详细介绍了该主题.


ams*_*ams 11

从程序员的角度来看,它恰恰意味着:

dup2(1, 2);
Run Code Online (Sandbox Code Playgroud)

请参见手册页.

理解这2>&1是一个副本也解释了为什么......

command >file 2>&1
Run Code Online (Sandbox Code Playgroud)

......和...不一样

command 2>&1 >file
Run Code Online (Sandbox Code Playgroud)

第一个将发送两个流file,而第二个将发送错误stdout,并将普通输出发送到file.


tfm*_*gue 9

unix_commands 2>&1

这用于将错误打印到终端。

  • 当产生错误时,它们被写入内存地址处的“标准错误”缓冲区&2,以及2来自该缓冲区的引用和流。
  • 当产生输出时,它们被写入内存地址处的“标准输出”缓冲区&1,以及1来自该缓冲区的引用和流。

那么回到命令。每当程序unix_commands产生错误时,它都会将其写入错误缓冲区。因此,我们创建一个指向该缓冲区的指针2,并将>错误重定向到输出缓冲区&1。至此我们就完成了,因为输出缓冲区中的任何内容都由终端读取并打印。


Kur*_*fle 6

人们,永远记得paxdiablo关于重定向目标当前位置的暗示......这重要.

我对2>&1运营商的个人助记符是这样的:

  • 想到&意义'and''add'(角色是一个安瓿 - 而且,不是吗?)
  • 所以它变成:'重定向2(stderr)到where 1(stdout)已经/当前是并添加两个流'.

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

  • 想想&意思andadd......(你明白了&符号,是吗?)
  • 所以它变成: '重定向1(stdout)到where 2(stderr)已经/当前是并添加两个流'.

永远记住:你必须从右边到左边(不是从左到右)读取重定向链.


Mat*_*ijs 6

如果/foo您的系统上不存在并且/tmp...

$ ls -l /tmp /foo
Run Code Online (Sandbox Code Playgroud)

将打印内容/tmp并打印错误消息/foo

$ ls -l /tmp /foo > /dev/null
Run Code Online (Sandbox Code Playgroud)

将发送内容/tmp/dev/null并打印错误消息/foo

$ ls -l /tmp /foo 1> /dev/null
Run Code Online (Sandbox Code Playgroud)

将完全相同(注意1)

$ ls -l /tmp /foo 2> /dev/null
Run Code Online (Sandbox Code Playgroud)

将打印内容/tmp并发送错误信息/dev/null

$ ls -l /tmp /foo 1> /dev/null 2> /dev/null
Run Code Online (Sandbox Code Playgroud)

将发送列表以及错误消息 /dev/null

$ ls -l /tmp /foo > /dev/null 2> &1
Run Code Online (Sandbox Code Playgroud)

是简写


Kal*_*dhi 5

这就像将错误传递给stdout或终端一样.

也就是说,cmd不是命令:

$cmd 2>filename
cat filename

command not found
Run Code Online (Sandbox Code Playgroud)

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

2>&1
Run Code Online (Sandbox Code Playgroud)

标准错误发送到终端.


yur*_*hen 5

重定向输入

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

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

[n]<word
Run Code Online (Sandbox Code Playgroud)

重定向输出

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

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

[n]>word
Run Code Online (Sandbox Code Playgroud)

移动文件描述符

重定向运算符,

[n]<&digit-
Run Code Online (Sandbox Code Playgroud)

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

同样,重定向运算符

[n]>&digit-
Run Code Online (Sandbox Code Playgroud)

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

参考:

man bash
Run Code Online (Sandbox Code Playgroud)

键入/^REDIRECT以找到该redirection部分,并了解更多信息...

在线版本在这里:3.6重定向

PS:

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