我想阻止我的程序将 stdout 和 stderr 发送到任何终端、文件或设备。为此,我脑子里闪过三个命令,但我无法区分它们的区别。请您向我解释一下它们各自的含义好吗?
# ./run > /dev/null
# ./run > /dev/null 1>&2
# ./run > /dev/null 2>&1
答案1
# ./run > /dev/null
这会将 stdout 重定向到/dev/null
,但它对 stderr 根本不执行任何操作。由于您要求从 stdout 和 stderr 重定向,因此这不会执行您想要的操作。
# ./run > /dev/null 1>&2
这将 stdout 重定向到/dev/null
,然后再次将 stdout 重定向 ( 1>
) 到 stderr 指向 ( &2
) 的任何地方,这可能是终端,并且可能是 stdout 在重定向之前指向的位置。因此,这里的最终效果(可能)是 stdout 根本没有重定向,而对于 stderr,您仍然不对其执行任何操作。所以这也不是你想要的。
# ./run > /dev/null 2>&1
这会将 stdout 重定向到/dev/null
,然后将 stderr ( 2>
) 重定向到 stdout 指向的任何位置,这是/dev/null
因为那是您刚刚将其重定向的位置。这似乎就是你想要的。
我无法区分他们的差异。
实际上,您应该能够很容易地区分这些差异。假设./run
包含这个:
#!/bin/sh
echo stdout
echo stderr >&2
那么结果应该如下:
# ./run > /dev/null
stderr
# ./run > /dev/null 1>&2
stdout
stderr
# ./run > /dev/null 2>&1
区别很明显!