clean javac输出,可能通过unix(cygwin)工具

bxjv4tth  于 2021-07-04  发布在  Java
关注(0)|答案(1)|浏览(413)

我是java新手,在windows 10上安装了以下jdk:

C:\Program Files\AdoptOpenJDK\jdk-11.0.8.10-openj9

我可以调用编译器 javac 从cygwin的bash命令行(在x-terminal中),但它创建了许多错误,似乎两者都没有 stdout 或者 stderr 。我需要把它们发送到一个我可以用vim阅读的文件中。
这是我的调用命令


# mk.bash

# -------

javac \
-classpath "/c/Program Files/.../cplex.jar" \
TestSetup.java

这个 classpath 争论在这里是无关紧要的,因为我只想把重点放在捕捉 javac 的输出以vim可读的方式。
发行 ./mk.bash >| mk.out 生成空的 mk.out ,也一样 ./mk.bash 2>&1 >| mk.out . 几十年来,我一直使用后一种模式将stderr重定向到stdout并覆盖目标文件。
我可以使用 script 命令发送 javac 输出到 mk.out :

script mk.out
./mk.bash
exit

然后我可以使用 Vim . 但是,内容被许多二进制字符(下面的图像和文件链接)混淆了。通常情况下,我可以用 dos2unix ,但在这个输出上,它由于二进制字符而退出。
作为清理非文本内容的另一种方法,vim有一个 fileformat=dos 可使用输入的选项 :e ++ff=dos % . 这个 e 以及 % 说要编辑当前文件,而 ++ff=dos 说把文件解释成 dos 格式( fffileformat ). 所有这一切都是为了清除由于unix和dos中不同的行尾而产生的视觉工件。所有的错误消息仍然穿插着看起来像转义字符的内容 ^[ .
有没有什么办法 javac 只生成纯文本输出还是清除输出?
以下是vim中非纯文本文件的图像:

我怀疑这一切都是相关的,但我下面这个网页编译一个简单的java应用程序 TestSetup.java 调用第三方工具:https://kunlei.github.io/cplex/cplex-java-setup.

exdqitrt

exdqitrt1#

底线在前面
下面的bash命令发送 stdout 以及 stderrjavac 到屏幕和文件 mk.out :

javac -classpath /Some/NonExistent/Jar/File.jar TestSetup.java \
2>&1 | tee mk.out

怎么找到的
我发现问题主要是bash管道、重定向和 script 命令。后者负责ansi代码。我之前无法确定这一点,因为我无法捕获 javac 文件中的错误消息 script . 所以我先解决了这个问题,然后比较了 script 因为没有 script . 这是我发现的。
下面的bash命令创建不带ansi代码的dos格式文件:

javac -classpath '/Some/NonExistent/File.jar' TestSetup.java \
>| mk.out 2>&1

以前,我有:(1) 2>&1 >| mk.out 代替(2) >| mk.out 2>&1 . 对于选项(1),我想 stderr 成为指向 stdout ,所以我只需要指挥 stdoutmk.out .
但事情不是这样的。在选项(1)中,规范 2>&1 指导 stderr 为了什么 stdout 当前指向屏幕。随后的 >| mk.out 然后指示 stdout (仅限于 std.out )至 mk.out . 不幸的是,这意味着 stderr 还是要上银幕。急板地, mk.out 空的(坏的)。
在选项(2)中, stdout 首先指向 mk.out . 随后的 2>&1 然后指示 stderr 为了什么 stdout 指向,即。, mk.out . 因此 javac 将错误消息发送到 mk.out . 它没有包含ansi代码,这很好。
虽然方案(2)可行,但并不理想;错误消息不会显示在屏幕上。我又回到了这里 script 发现它引入了ansi代码:

script \
-c "javac -classpath '/Some/NonExistent/File.jar' TestSetup.java" \
mk.out

因为以上解决了重定向的问题 stderr ,我寻找bash选项来避免 script . 以下发送 stderr 到屏幕和 mk.out :

javac -classpath /Some/NonExistent/Jar/File.jar TestSetup.java \
2>&1 | tee mk.out

根据上面选项(1)的解释,它看起来不应该工作,但是bash在管道中使用时会出现异常。明确地, stderr 重定向到什么 stdout 定向到,但仅在所有重定向之后。在管道中,上述情况意味着 javacstdout 指向 teestdin ,只有这样 javacstderr 指向目标 javacstdout ,即。, teestdin .
供参考:初始解决方案( javac 的xstdout选项)
我发现我的 javac 具有命令行选项 -Xstdout OutputFileName.txt 专门为此目的。
不幸的是,不是所有的 javac 我在网上找到的文档显示了这个选项的可用性。在这种情况下,我找到的最直接的解决办法是 :term cat The/Output/File.Path 在 vim 。
许多vim替代品也显示在该页面上,以及这里
为备将来参考,如有需要,我发现一些相关的页面有:
https://superuser.com/questions/380772/removing-ansi-color-codes-from-text-stream
https://unix.stackexchange.com/questions/14684/removing-control-chars-including-console-codes-colours-from-script-output
https://unix.stackexchange.com/questions/4527/program-that-passes-stdin-to-stdout-with-color-codes-stripped
提到 ansi2txt 但是你需要ubuntu。

相关问题