Wil*_*ard 22 linux bash gnu stderr stdout
为什么有些 Linux 程序的输出既不去 STDOUT 也不去 STDERR?
实际上,我想知道如何可靠地捕获所有程序输出,无论它使用什么“流”。我的问题是有些程序似乎不让他们的输出被捕获。
一个例子是“时间”命令:
time sleep 1 2>&1 > /dev/null
real 0m1.003s
user 0m0.000s
sys 0m0.000s
Run Code Online (Sandbox Code Playgroud)
或者
time sleep 1 &> /dev/null
real 0m1.003s
user 0m0.000s
sys 0m0.000s
Run Code Online (Sandbox Code Playgroud)
为什么我两次都看到输出?我希望这一切都通过管道输入/dev/null。
时间使用的是什么输出流,我如何将其通过管道传输到文件中?
解决此问题的一种方法是创建一个Bash脚本,例如,combine.sh包含以下命令:
$@ 2>&1
Run Code Online (Sandbox Code Playgroud)
然后可以以正确的方式捕获 'time' 的输出:
combine.sh time sleep 1 &> /dev/null
Run Code Online (Sandbox Code Playgroud)
(没有看到输出 - 正确)
有没有办法在不使用单独的组合脚本的情况下实现我想要的?
gni*_*urf 38
这个问题在BashFAQ/032 中得到解决。在您的示例中,您将:
{ time sleep 1; } 2> /dev/null
Run Code Online (Sandbox Code Playgroud)
之所以
time sleep 1 2>/dev/null
Run Code Online (Sandbox Code Playgroud)
不表现如何你希望是因为与句法,你要time的命令sleep 1 2>/dev/null(是的,命令sleep 1与标准错误重定向到/dev/null)。内置函数以time这种方式工作,以使这实际上成为可能。
该bash 内建能真正做到这一点,因为......嗯,这是一个内建命令。对于time通常位于/usr/bin. 的确:
$ /usr/bin/time sleep 1 2>/dev/null
$
Run Code Online (Sandbox Code Playgroud)
现在,你的问题的答案
为什么有些 linux 程序的输出既不去 STDOUT 也不去 STDERR?
是:确实如此,输出到stdout或stderr。
希望这可以帮助!
小智 14
您对特定问题time的内置已经回答了,但都没有任何写一些命令stdout或stderr。一个经典的例子是 Unix 命令crypt。 crypt不带参数加密标准输入stdin并将其写入标准输出stdout。它会使用 提示用户输入密码getpass(),默认情况下会向 输出提示/dev/tty。 /dev/tty是当前终端设备。写入/dev/tty具有写入当前终端的效果(如果有,请参阅isatty())。
crypt无法写入的原因stdout是因为它将加密输出写入stdout. 此外,最好是提示/dev/tty而不是写入,stderr以便如果用户重定向stdoutand stderr,提示仍然可见。(出于同样的原因,crypt无法从 读取密码stdin,因为它被用于读取要加密的数据。)
| 归档时间: |
|
| 查看次数: |
7075 次 |
| 最近记录: |