Answers:
有时您想将stdout 和 stderr 都重定向到同一位置,这>&
是使用时–它将一个文件描述符指向另一个文件描述符。
例如,如果您要将stdout和stderr都写到同一个文件(它是/dev/null
或output.txt
)中,则可以使用
app 1>/dev/null 2>/dev/null
或者,您可以将一个文件描述符重定向到文件,将另一个文件描述符重定向到第一个文件描述符:
app 1>/dev/null 2>&1
app 2>/dev/null 1>&2
在第一个示例中,将2>&1
文件描述符#2指向#1已经指向的位置。第二个示例实现了相同的功能,只是从stderr开始。
作为另一个示例,在某些情况下,stdout(文件描述符#1)已经指向所需的位置,但是您不能按名称引用它(它可能与管道,套接字等相关联)。在使用进程扩展(the ` `
或$( )
operator)时通常会发生这种情况,通常只捕获stdout,但您可能希望在其中包含stderr。在这种情况下,您还可以>&
将stderr指向stdout:
out=$(app 2>&1)
另一个常见的示例是寻呼机或grep
或类似的实用程序,因为管道|
通常仅在stdout上工作,因此在使用管道之前,您需要将stderr重定向到stdout:
app 2>&1 | grep hello
如何知道哪些的2>&1
或者1>&2
是正确的?在已经建立的文件描述符去的权利>&
,并且希望重定向文件描述符转到左边。(2>&1
表示“将文件描述符#2指向文件描述符#1”。)
有些外壳程序具有用于常见重定向的快捷方式。这是Bash的示例:
1>
可以缩短为 >
1>foo 2>&1
到>&foo
或&>foo
2>&1 | program
至 |& program
the already set up fd goes to the right of >&, and the fd you want to redirect goes to the left
。您已经设置的文件描述符是什么意思?这意味着什么?
您需要的一种情况是要strace
在寻呼机中显示输出。strace
将其输出打印为标准错误,并且管道通常将标准输出连接至标准输入,因此您必须使用重定向:
strace -p $pid 2>&1 | less
pipes generally connect standard output to standard input
?
|
)接受第一个命令的标准输出,并将其连接到第二个命令的标准输入。
2:用于当您同时具有来自标准错误和标准输出的输出,并且希望将它们组成一个字符串时。
1:要同时处理标准错误和标准输出的输出时。
>2
都发送到/ dev / null。还是我完全理解错了?
我用它来开始一个独立的工作:
someProgram 2>&1 >& my.log &
然后我可以注销,并且someProgram仍将运行。该功能由GNU Screen,tmux和其他一些程序提供-但是在这里它是在没有外部依赖的情况下实现的。
nohup
或disown
在这种情况下。
替代方案:终端命令将输出显示到另一个终端
tty
在每个终端中使用命令来标识它们:
$ tty
/dev/pts/0
$ tty
/dev/pts/1
假设这些TTY,要将第一个的stdout重定向到第二个,在第一个终端中运行:
exec 1>/dev/pts/1
注意:现在每个命令输出将在pts / 1上显示
恢复默认行为标准输出pts / 0:
exec 1>/dev/pts/0
观看此视频进行演示。
app 1>/dev/null 2>&1
意味着2>&1会指向1已经重定向到的文件。我认为我可以轻松地做到app > /dev/null &>
吗?