命令行中“2>&1”起什么作用?

命令行中“2>&1”起什么作用?

我知道该>符号用于命令行中的输出重定向,但我找不到可以解释2>&1命令行中该符号用法的内容。例如:

curl http://www.google.com > /dev/null 2>&1 &

答案1

表示1标准输出 (stdout)。2表示标准错误 (stderr)。

因此2>&1表示将标准错误发送到标准输出被重定向的地方。由于它被发送到那里,/dev/null这类似于完全忽略任何输出。

答案2

总结

获取http://www.google.com背景并丢弃stdoutstderr

curl http://www.google.com > /dev/null 2>&1 &

是相同的

curl http://www.google.com > /dev/null 2>/dev/null &

基本

012代表标准文件描述符POSIX操作系统。文件描述符是系统对(基本上)文件或插座

在 C 中创建一个新的文件描述符可能如下所示:

fd = open("data.dat", O_RDONLY)

大多数 Unix 系统命令都需要一些输入并将结果输出到终端。curl将获取指定 URL 上的任何内容(google 网站)并将结果显示到stdout

卷曲结果

重定向

就像您所说的那样<,它>用于将命令的输出重定向到其他地方,例如文件。

例如,ls > myfiles.txtls获取当前目录的内容并将>其输出重定向到myfiles.txt(如果文件不存在,则创建它,否则覆盖它,但您可以使用>>而不是>将其附加到文件)。如果运行上述命令,您将注意到终端上没有显示任何内容。这通常意味着在 Unix 系统中成功。要检查这一点,cat myfiles.txt请将文件内容显示在屏幕上。

> /dev/null 2>&1

第一部分> /dev/null将 重定向stdout,即将curl的输出重定向到/dev/null(详细信息请见下文)并将2>&1重定向stderrstdout(刚才重定向到,/dev/null因此所有内容都将发送到/dev/null)。

左边2>&1告诉你什么将被重定向,右侧会告诉您在哪里至。&右侧使用 来区分stdout (1)或与名为或 的stderr (2)文件。因此,最终会创建一个名为 的新文件(如果它尚不存在)并将结果转储到其中。122>11stderr

/dev/null

/dev/null是一个空文件,这是一种用于丢弃写入其中的所有内容的机制。因此, curl http://www.google.com > /dev/null有效地抑制了curl的输出。

> /dev/null

为什么终端上还显示一些东西吗?这是不是 curl的常规输出,但数据发送到stderr,这里用于显示进度和诊断信息,而不仅仅是错误

curl http://www.google.com > /dev/null 2>&1忽略 的curl输出和curl的进度信息。结果是终端上不显示任何内容。

最后

最后的&是你如何告诉 shell 将命令作为工作在里面背景。这导致迅速的立即返回,而命令在后台异步运行。要查看当前作业,请jobs在终端中输入。注意这是不同的来自系统中正在运行的进程。要查看这些内容,请top在终端中输入。

参考

答案3

2指的是 STDERR。将把 STDERR 发送到与(STDOUT)2>&1相同的位置。1

答案4

我的理解如下:

如果你只想在屏幕上读取命令的输出和错误信息,那么只需写下: curl http://www.google.com

有时您想将输出信息保存到文件而不是终端屏幕以供稍后查看,那么您可以写道: curl http://www.google.com > logfile

但这样一来,StdErr 信息就会被省略,因为>只将 StdOut 重定向到了logfile

所以如果你关心命令执行失败时的错误信息,那么你需要使用将 StdOut 与 StdErr 结合起来2>&1(即将 StdErr 折叠到 StdOut 中),因此可以写成以下命令行: curl http://www.google.com > logfile2>&1

相关内容