【问题标题】:Redirecting stderr to file and stdout to console将标准错误重定向到文件和标准输出到控制台
【发布时间】:2017-01-11 12:52:07
【问题描述】:
dcc  -tPPCE200Z4VEN:simple -Xdialect-ansi -XO -g3 -Xsize-opt -Xsmall-data=0 -Xno-common -Xnested-interrupts -Xdebug-dwarf2 -Xdebug-local-all -Xdebug-local-cie -Xdebug-struct-all -Xforce-declarations -ee1481 -Xmacro-undefined-warn -Xlink-time-lint -W:as:,-l -Wa,-Xisa-vle -Xsmall-const=0 -Xforce-prototypes -Xpass-source -Xkeep-assembly-file -c -Xlint -Xenum-is-best -Xinline=0 -Xaddr-sconst=0x11 -Xaddr-sdata=0x11  -DDISABLE_MCAL_INTERMODULE_ASR_CHECK -DOSDIABPPC -DSC667349 -DFLASH_START -DV_SUPPRESS_EXTENDED_VERSION_CHECK -DV_USE_DUMMY_STATEMENT=STD_OFF -DEU_DISABLE_ANSILIB_CALLS -DMCAL_CER_VALIDATION -DOsAppMode=OSAPPMODEDEFAULT -DSKIP_MAGIC_NUMBER -DRTE_MICROSAR_PIM_EXPORT -DMEMIF_FAST_NVM_ACTIVATED=STD_ON -DESCLmgr_IsENABLED -DESCLmgr_CANrouting_RESvalidity=1 -DFEE_SWITCH_NOT_CONFIG_BLOCKS=STD_OFF -DFILL_NOINIT_WITH_ZERO -Dsrc -ID:\project\src -ID:\project\obj -E D:\project\src\hello.c 1> D:\project\obj\hello.i 2>&1

我正在预处理一个 .c 文件(编译器 wind river mpc ),然后将标准输出重定向到 .i 文件中,并从 .i 文件中构建 .pp 文件。之后,我将 stderr 重定向到控制台 (2>&1)。检查上面命令行末尾的重定向。

我知道关于这个主题有很多问题,但我正在做正确的重定向,但错误出现在 .pp 文件中:

# 4 D:\project\src\hello.c", line 5: error (dcc:1573): Only Debug builds are supported

这个错误实际上是来自stdout,不能拆分吗?

【问题讨论】:

    标签: c c-preprocessor stdout stderr console-redirect


    【解决方案1】:

    2>&1 并不意味着“将 stderr 重定向到控制台”,它的意思是“将 stderr 重定向到 stdout 当前所在的位置”。如果您按照其他顺序进行重定向——2>&1 1>hello.i 而不是1>hello.i 2>&1——那么您将获得我相信您正在寻找的效果。

    您需要考虑一次发生一个重定向。如果你说1>hello.i 2>&1,就会发生这种情况:

    • 首先,stdout 被重定向到hello.i
    • 然后stderr被重定向到stdout的当前目的地,即hello.i

    但如果你说2>&1 1>hello.i,就会发生这种情况:

    • 首先,stderr 被重定向到 stdout 的当前目的地,即控制台。
    • 然后stdout被重定向到hello.i

    【讨论】:

    • 现在说得通了!感谢您的详细解释以及我的问题与实际解决方案之间的明确比较!
    • 即使使用此解决方案也不会进行重定向,我的假设是 stdout 和 stderr 都在 stdout 中被压缩...
    • 这很奇怪。它适用于我,无论是在这种语法起源的 Unix shell 中,还是在您正在使用的 Windows 命令行中。 (如果您碰巧安装了 Python 并且在您的路径中,您可以执行与我刚才所做的相同的测试:python -c "import sys; sys.stdout.write('stdout\n'); sys.stderr.write('stderr\n');" 后跟 >test.txt 2>&12>&1 >test.txt。)前者将“stdout”和“stderr”都放入文件;后者将“stdout”放在文件中,将“stderr”放在控制台上。
    • 对于普通测试它也适用于我,但这个不同,它使用一些编译器特定的选项来为预处理文件提供一些附加信息(行号、包含路径)......跨度>
    • 如果我只将stderr 重定向到stdout 所在的位置,错误会显示在控制台中并且.pp 文件为空(从.ii 文件中,我构建了.pp 文件并现在可以了)。如果我将stdout 重定向到.ii 文件,那么stderr 将出现在.pp 文件中。
    猜你喜欢
    • 1970-01-01
    • 2019-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-26
    • 1970-01-01
    • 2019-09-03
    • 2012-08-15
    相关资源
    最近更新 更多