为什么我不能从 bash -c 命令行中重定向 stderr?

Adr*_*ian 1 bash cygwin

我正在尝试记录命令执行的时间,因此我是通过time在 bash 中使用内置命令来实现的。我还希望同时将 stderr 和 stdout 重定向到日志文件。但是,它似乎不起作用,因为 stderr 只是溢出到我的终端上。

这是命令:

rm -rf doxygen
mkdir doxygen
bash -c 'time "/cygdrive/d/Program Files/doxygen/bin/doxygen.exe" Doxyfile > doxygen/doxygen.log 1>&2' genfile > doxygen/time 1>&2 &
Run Code Online (Sandbox Code Playgroud)

我在这里做错了什么?

Jon*_*ler 5

您正在使用1>&2而不是2>&1.

随着名称长度的减少,您正在尝试运行:

bash -c 'time doxygen Doxyfile > doxygen.log 1>&2' genfile > doxygen.time 1>&2 &
Run Code Online (Sandbox Code Playgroud)

> doxygen.log发送标准输出到文件; 在1>&2随后改变了主意,将标准输出到同一个地方标准错误是怎么回事。与外部重定向对类似。

如果您使用:

bash -c 'time doxygen Doxyfile > doxygen.log 2>&1' genfile > doxygen.time 2>&1 &
Run Code Online (Sandbox Code Playgroud)

然后你将标准错误发送到标准输出的同一个地方——两次。

顺便说一句,您是否意识到genfile用作$0由 运行的脚本bash -c '…'?我不相信您的脚本中需要它。要看到这一点,请尝试:

bash -c 'echo 0=$0; echo 1=$1; echo 2=$2' genfile jarre oxygene
Run Code Online (Sandbox Code Playgroud)

运行时,这会产生:

0=genfile
1=jarre
2=oxygene
Run Code Online (Sandbox Code Playgroud)