Answers:
的1
表示标准输出(stdout)。的2
表示标准错误(错误)。
所以2>&1
说将标准错误发送到标准输出也要重定向到的地方。既然被发送到,/dev/null
就好像完全忽略了任何输出。
0
(stdin),1
(stdout)和2
(stderr)实际上是文件描述符,所以外壳程序需要在它们前面加上一个&符才能进行重定向。在这种情况下,它会复制文件描述符,从而有效地将两个信息流合并在一起。
curl http://www.google.com 2>/dev/null
命令行如何知道这里的“ 2”旨在表示stderr,实际上不是我要传递给curl命令的第二个参数?
stderr
直接发送到/dev/null
。您可以通过尝试在实践中看到它curl
,curl 1>/dev/null
而curl 2>/dev/null
只是看到输出更改。同样,&符号仅在重定向到文件描述符时才需要。
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
将获取指定网址(google dot com)上的任何内容,并将结果显示到stdout
。
如您所说<
,>
用于将命令的输出重定向到其他位置,例如文件。
例如,在中ls > myfiles.txt
,ls
获取当前目录的内容>
并将其输出重定向到myfiles.txt
(如果文件不存在,则创建该文件,否则将其覆盖,但是可以使用>>
代替将>
其附加到文件中)。如果运行上面的命令,您将注意到终端上没有任何显示。这通常意味着在Unix系统中取得成功。选中此项cat myfiles.txt
以在屏幕上显示文件内容。
第一部分> /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
是一个空文件,一种用于丢弃写入其中的所有内容的机制。因此,
curl http://www.google.com > /dev/null
有效抑制了curl
输出。
但是,为什么终端上仍然显示某些内容?这不是 curl
常规输出,而是发送到的数据stderr
,这里用于显示进度和诊断信息,而不仅仅是错误。
curl http://www.google.com > /dev/null 2>&1
忽略curl
的输出和curl
进度信息。结果是终端上什么也没有显示。
最后&
,您将告诉外壳程序如何在后台将命令作为作业运行。这将导致提示在后台异步运行命令时立即返回。要查看当前作业,请在终端中输入。请注意,这与系统中运行的进程不同。要查看这些,请在终端中输入。jobs
top
/dev/null
?您不希望curl
至少某处的结果有用吗?
我的理解如下:
如果只想读取屏幕上命令的输出和错误信息,则只需编写:
curl http://www.google.com
有时您想将输出信息保存到文件中,而不是保存到终端屏幕中以供以后查看,然后可以编写:
curl http://www.google.com > logfile
但是通过这种方式,由于>
仅将StdOut重定向到,因此将省略StdErr信息logfile
。
因此,如果您担心命令执行失败后的错误信息,则需要使用来组合StdOut和StdErr 2>&1
(这意味着将StdErr折叠成StdOut),因此可以编写以下命令行:
curl http://www.google.com > logfile
2>&1