我知道该>
符号用于命令行中的输出重定向,但我找不到可以解释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
背景并丢弃stdout
和stderr
。
curl http://www.google.com > /dev/null 2>&1 &
是相同的
curl http://www.google.com > /dev/null 2>/dev/null &
基本
0
,1
并2
代表标准文件描述符在POSIX操作系统。文件描述符是系统对(基本上)文件或插座。
在 C 中创建一个新的文件描述符可能如下所示:
fd = open("data.dat", O_RDONLY)
大多数 Unix 系统命令都需要一些输入并将结果输出到终端。curl
将获取指定 URL 上的任何内容(google 网站)并将结果显示到stdout
。
重定向
就像您所说的那样<
,它>
用于将命令的输出重定向到其他地方,例如文件。
例如,ls > myfiles.txt
在ls
获取当前目录的内容并将>
其输出重定向到myfiles.txt
(如果文件不存在,则创建它,否则覆盖它,但您可以使用>>
而不是>
将其附加到文件)。如果运行上述命令,您将注意到终端上没有显示任何内容。这通常意味着在 Unix 系统中成功。要检查这一点,cat myfiles.txt
请将文件内容显示在屏幕上。
> /dev/null 2>&1
第一部分> /dev/null
将 重定向stdout
,即将curl
的输出重定向到/dev/null
(详细信息请见下文)并将2>&1
重定向stderr
到stdout
(刚才重定向到,/dev/null
因此所有内容都将发送到/dev/null
)。
左边2>&1
告诉你什么将被重定向,右侧会告诉您在哪里至。&
右侧使用 来区分stdout (1)
或与名为或 的stderr (2)
文件。因此,最终会创建一个名为 的新文件(如果它尚不存在)并将结果转储到其中。1
2
2>1
1
stderr
/dev/null
/dev/null
是一个空文件,这是一种用于丢弃写入其中的所有内容的机制。因此,
curl http://www.google.com > /dev/null
有效地抑制了curl
的输出。
但为什么终端上还显示一些东西吗?这是不是 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 > logfile
2>&1